我正在开发一个项目,其中包含一个 ui-module,它使用 Spring 提供一个 Web-UI。该项目具有以下结构:
项目 - 用户界面 - pom.xml -src/main/java - 主要的 - pom.xml -src/main/java - 核 - 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>
根 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 将是可执行的,并且会显示 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。这引发了第一个问题,我必须从 main 中知道 ui(这原本不是我想要的。主模块应该只依赖于 Guice 并请求某些接口的实现,而不知道模块)。添加依赖项后,我还是尝试创建一个可执行的 jar,但得到了相同的结果。
编辑2
这个问题不关心我如何一次编译一个多模块 Maven 项目,而是关心生成的 jar-with-dependencies 可以运行的原因,但是一旦 Spring 应该启动(在显示 Spring-boot 输出之后),一个IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories被抛出,我该如何解决这个问题。
我发现(如问题中所述)一个可能的解决方案,这对我不起作用。