Java Maven编译并提供了使用surefire插件对JPMS模块进行单元测试的范围

Java Maven编译并提供了使用surefire插件对JPMS模块进行单元测试的范围,java,maven,maven-surefire-plugin,java-module,Java,Maven,Maven Surefire Plugin,Java Module,试图测试我的maven项目(一个父pom和几个模块(jpms模块)),我在启动fork时遇到了恼人的错误: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M4:test (default-test) on project com.foo.plugin: There are test failures. ... Error occurred in starting fork, check ou

试图测试我的maven项目(一个父pom和几个模块(jpms模块)),我在启动fork时遇到了恼人的
错误:

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.0.0-M4:test (default-test) on project com.foo.plugin: There are test failures.
...
Error occurred in starting fork, check output in log
Process Exit Code: 1
org.apache.maven.surefire.booter.SurefireBooterForkException: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?
...
Error occurred in starting fork, check output in log
Process Exit Code: 1
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.fork(ForkStarter.java:690)
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:285)
    at org.apache.maven.plugin.surefire.booterclient.ForkStarter.run(ForkStarter.java:248)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeProvider(AbstractSurefireMojo.java:1217)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.executeAfterPreconditionsChecked(AbstractSurefireMojo.java:1063)
    at org.apache.maven.plugin.surefire.AbstractSurefireMojo.execute(AbstractSurefireMojo.java:889)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginM
例如,我找到了一个解决方案,建议在surefire插件配置中设置
0
。然而,这种解决方案不允许在模块路径上运行测试,所以我选择了这个surefire

Surefire开发人员(感谢他们)发现原因在于我使用的依赖项的maven范围。在我的项目中,我有:

         <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <version>2.1.6</version>
            <scope>provided</scope> <!-- NOTE IT -->
        </dependency>
        <dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>2.3.2</version>
            <scope>provided</scope> <!-- NOTE IT -->
        </dependency>

雅加达
jakarta.ws.rs-api
2.1.6
假如
jakarta.xml.bind
jakarta.xml.bind-api
2.3.2
假如
他们说必须是:

          <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <version>2.1.6</version>
            <scope>compile</scope> <!-- NOTE IT -->
        </dependency>
        <dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>2.3.2</version>
            <scope>compile</scope> <!-- NOTE IT -->
        </dependency>

雅加达
jakarta.ws.rs-api
2.1.6
编写
jakarta.xml.bind
jakarta.xml.bind-api
2.3.2
编写
当我改变范围时,我的项目由surefire测试,没有问题。这两个依赖项
jakarta.ws.rs api
jakarta.xml.bind api
都是JPMS模块,是我的JPMS模块所必需的


因此,问题是,我的代码中存在问题(
如果我想为我的JPMS模块运行测试,那么提供的
是错误的),还是surefire插件中存在问题?

注意:您可以自由删除
编译
,因为POM中没有范围声明意味着Maven无论如何都将使用默认值
编译

提供的范围是项目架构方面

它用于应用程序服务器包含WS-API的情况(即使不同的arfifact文件名)。通过这种方式,我们将其标记为
提供的
,这使得WAR文件更小,并且不包括WS-API工件

在您也正在构建无服务器应用程序并且正在构建自己的容器的情况下,则不需要声明所提供的
范围。在那里,工件将出现在脂肪罐中,这是您所期望的

如您所见,标记为提供的依赖关系处理类路径。它出现在编译器类路径上,但不出现在运行时

提供的作用域
中还有一项功能
。这是一种继承,这种依赖关系不能通过传递方式继承。 如果您在POM中提供的范围内有这样的依赖项,那么继承将不会在依赖子POM中看到依赖项

有关更多信息,请参阅Maven文档

此范围仅在编译和测试类路径上可用,并且不可传递


我不能同意你的看法。我使用提供的
作为1)我不需要胖JAR,因为胖JAR与jpms、jpms模块、jpms层完全矛盾。2) 我不希望我的jpms war项目包括所有其他库,因为它也是一个jpms模块,所以它必须在模块路径上使用其他jpms模块。因此,我们必须能够使用
提供的
范围测试任何JPM,并在模块路径上进行测试。@Pavel_K我不确定JPM是否真的被任何人使用,特别是与Java EE或Jakarta EE结合使用。@JFMeier现在,现在它被使用了。在我们公司,我们在一个JPMS层中使用Jetty,在子JPMS层中使用web应用程序。我询问了Jetty开发人员,他们增加了JPMS对Jetty的支持,我看到其他人对他们表示感谢。现在,据我所知,他们致力于支持JPMS web应用程序。@JFMeier正如我在问题中提到的jakarta.ws.rs-api和jakarta.xml.bind-api都是JPMS模块,所以他们正在转向JPMS。很快它就会变得非常流行,因为模块系统有很多优点。我怀疑模块系统是否会被很多人使用。你需要在你的应用程序中重写很多东西,我不清楚它的好处。