在非传统的包结构中用spring创建可执行jar

时间:2018-09-01 16:08:22

标签: java spring maven spring-boot

我正在开发一个项目,其中包含一个ui模块,该模块使用Spring提供了一个Web-UI。该项目具有以下结构:

project
 - ui
   - pom.xml
   - src/main/java
 - main
   - pom.xml
   - src/main/java
 - core
   - pom.xml
   - src/main/java
 - pom.xml

只有ui模块具有对spring的依赖关系(其他模块永远不应该了解spring,以将其与项目的其余部分分离)。其pom.xml文件如下所示:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath/>
</parent>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
            <version>3.7.0</version>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>my.id</groupId>
        <artifactId>core</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

root pom看起来像这样:

<modules>
    <module>ui</module>
    <module>core</module>
    <module>main</module>
</modules>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
            <version>3.7.0</version>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <skipAssembly>false</skipAssembly>
                <archive>
                    <manifest>
                        <mainClass>my.id.main.Main</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>my.id.main.Main</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>my.id</groupId>
        <artifactId>core</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>my.id</groupId>
        <artifactId>ui</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>my.id</groupId>
        <artifactId>main</artifactId>
        <version>1.0-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

问题

我试图创建一个可执行jar,以将该应用程序部署在服务器上。我跑了:

mvn clean compile package verify install

为了澄清,我仅使用此非正统的语句,因为其他所有内容均不起作用。调用mvn clean install将产生与以前相同的jar。

调用mvn clean compile install将导致Maven错误,指出“重新打包失败”。

只有在调用mvn clean compile package install之后才会产生一个全新的jar。

此错误是我正在处理的问题,不是问题的一部分。

生成的jar将是可执行的,并且将显示Spring-boot输出,但是片刻之后,将引发以下异常:

Exception in thread "pool-1-thread-3" java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.

所以我搜索了一段时间,找到了(可能的)解决方案来手动创建src / main / resources / META-INF / spring.factories文件。结果导致异常,可以通过删除spring.factories文件中的错误行来删除。但是,之后我得到以下异常:

org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

用这样的项目结构创建可执行jar完全可行吗?

我还尝试将spring父级赋予根pom.xml。但是,这并没有带来我需要的结果。结果与以前相同。


修改

我还尝试从主模块打包jar。这就提出了第一个问题,即我必须从主组件内部知道ui(最初不是我想要的。主模块应该仅依赖Guice并请求某些接口的实现,而无需了解模块)。添加依赖项后,无论如何我还是尝试创建一个可执行jar,但是得到了相同的结果。


edit2

这个问题与我如何Compile a multi-module Maven project at once无关,但是与可以运行生成的jar-with-dependencies的原因有关,但是与Spring应该启动(在显示Spring-boot输出之后)有关。 ,将引发IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories以及如何解决此问题。

我发现(如问题内所述)可能的解决方案,但对我不起作用。

0 个答案:

没有答案