【问题标题】:Spring Boot Application class does not existed in the test module(JPMS)测试模块中不存在 Spring Boot Application 类(JPMS)
【发布时间】:2021-10-14 19:20:29
【问题描述】:

我尝试使用 Java 9+ 内置的 JPMS(Java Platform Module System) 来模块化 Spring Boot 应用程序,检查the complete sample codes here

在 IDEA 中,运行测试时,它运行良好。

但是当我通过根文件夹中的mvn clean verify 运行它时,greeting.application.test 将由于异常“找不到包com.example.greeting.application 和类GreetingApplication”而失败。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project greeting-application-test: Compilation failure: Compilation fai
lure:
[ERROR] /D:/hantsylabs/spring-puzzles/modular-jpms/greeting-application-test/src/main/java/com/example/greeting/application/test/GreetingApplicationTests.java:[3,40] package com.exampl
e.greeting.application does not exist
[ERROR] /D:/hantsylabs/spring-puzzles/modular-jpms/greeting-application-test/src/main/java/com/example/greeting/application/test/GreetingApplicationTests.java:[13,19] cannot find symbo
l
[ERROR]   symbol: class GreetingApplication

greeting.application.test中的module-info.java是这样的。

module greeting.application.test {
    requires greeting.application;

    requires spring.web;
    requires spring.core;
    requires spring.beans;
    requires spring.context;

    requires spring.boot;
    requires spring.boot.autoconfigure;
    requires spring.webflux;

    requires spring.test;
    requires spring.boot.test;
    requires spring.boot.test.autoconfigure;

    requires org.junit.jupiter;
    requires org.junit.jupiter.api;
    requires org.junit.jupiter.params;
    requires org.junit.jupiter.engine;
    requires org.junit.platform.commons;
    requires org.assertj.core;
    requires org.mockito.junit.jupiter;
    requires transitive net.bytebuddy;

    opens com.example.greeting.application.test  to spring.core, org.junit.platform.commons;
}

【问题讨论】:

    标签: java spring-boot java-platform-module-system spring-boot-maven-plugin


    【解决方案1】:

    问题实际上并不在于“测试”模块,而是任何其他试图访问您构建的应用程序的模块。

    这是由于spring-boot-maven-plugin使用了repackage与其java模块对应的maven模块greeting-application造成的。

    文档中的#Classifier 部分进一步清楚地讨论了原因(由我强调):

    默认情况下,重新打包目标将原始工件替换为 重新包装了一个。对于代表 应用程序,但 如果您的模块被用作另一个模块的依赖项 模块,你需要为重新打包的模块提供一个分类器。这 原因是应用程序类被打包在 BOOT-INF/classes 使依赖模块无法加载重新打包的 jar 的类。

    因此,为了解决问题,您可以使用

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <classifier>exec</classifier>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    进一步引用与配置更新相关的文档:

    此配置将生成两个工件:原始工件和重新打包目标生成的重新打包对应部分。两者都将被透明地安装/部署。

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 2020-01-30
      • 1970-01-01
      • 2018-10-18
      • 2020-09-24
      • 2018-06-01
      • 1970-01-01
      • 2018-04-15
      • 2015-03-23
      相关资源
      最近更新 更多