Java9 多模块 Maven 项目测试依赖

9

我有一个多模块的Maven项目,包含三个模块coreutilstest-utils

Core模块具有以下依赖项定义

<dependency>
   <groupId>my.project</groupId>
   <artifactId>utils</artifactId>
</dependency>
<dependency>
   <groupId>my.project</groupId>
   <artifactId>test-utils</artifactId>
   <scope>test</scope>
</dependency>

我已经为三个模块添加了Java 9的module-info.java定义,其中core的定义如下:

module my.project.core {
   requires my.project.utils;
}

然而,我无法弄清楚如何让“core”的测试类在测试执行期间能够看到“test-utils”类。当“maven-surefire-plugin”尝试运行测试时,我会收到找不到类的错误。
如果我在“core”的“module-info.java”中添加“requires my.project.testutils;”:
module my.project.core {
   requires my.project.utils;
   requires my.project.testutils; //test dependency
}

然后在编译时,我会收到一个错误,指出找不到my.project.testutils模块(可能是因为它只作为测试依赖项引入)。

在Java 9模块化的世界中,如何处理测试依赖项?由于明显的原因,我不希望我的主要代码拉取测试依赖项。我有什么遗漏吗?


3
我不是Maven专家,也没有使用Surefire插件,但是带有两个“requires”的module-info.java肯定是错误的方向。一般来说,在Java 9中,测试是通过“修补”模块来实现的(Maven和Gradle往往会将其抽象化)。另外,不清楚你是否看过这个关于工具链的文档?- http://maven.apache.org/surefire/maven-surefire-plugin/java9.html - Michael Easter
1
这个不使用Surefire插件,也不使用test范围(所以我不会将其编写为答案),但是如果这有帮助的话,这里有一个使用Maven的小Java9示例 - https://github.com/codetojoy/WarO_Java_9_Maven - Michael Easter
@MichaelEaster 关于修补模块的部分是正确的,但工具链部分似乎与问题无关。 - Naman
相关链接:https://dev59.com/EFYN5IYBdhLWcg3w9Mbr - ZhekaKozlov
1个回答

5

如果你的my.project.testutils是测试范围的依赖项,并且使用Maven和Java9,那么你无需在模块描述符中显式包含(requires)它。


测试依赖项由类路径本身处理。因此,您可以简单地删除testutils,在执行测试时,maven会自动修补它。
module my.project.core {
   requires my.project.utils;
}

请参考maven-compiler-plugin相关的第30张幻灯片。

enter image description here

我建议您查看 将Java 8项目迁移到Jigsaw时应该放置单元测试的位置 和 Robert 在 此评论 中确认的 Maven 遵循的实现。 编辑: 创建了一个示例项目,类比说明主模块与您的core相同,对guava的依赖项与您的utils相同,并且对junit的依赖项与您的testutils相同。

示例项目是一个失效的链接。 - Olivier Grégoire
@OlivierGrégoire 嗯,看起来我已经迁移了这些项目,会尝试恢复...到那时,Sormuras的这些答案有很多示例链接 - 这个这个 - Naman
1
最近版本的Gradle也是如此。如果您声明了testImplementationtestCompileOnlytestRuntimeOnly依赖项,则不需要进行模块导入。 - Brad Mace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接