0

我正在开发一个项目,其中包含一个 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被抛出,我该如何解决这个问题。

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

4

0 回答 0