我正在开发一个项目,其中包含一个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
以及如何解决此问题。
我发现(如问题内所述)可能的解决方案,但对我不起作用。