Java9多模块Maven项目测试依赖项

kii*_*adi 7 java maven java-platform-module-system maven-surefire-plugin java-9

我有三个模块的多模块Maven项目core,utils以及test-utils

Core具有以下依赖项定义

<dependency>
   <groupId>my.project</groupId>
   <artifactId>utils</artifactId>
</dependency>
<dependency>
   <groupId>my.project</groupId>
   <artifactId>test-utils</artifactId>
   <scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)

module-info.java为所有三个模块添加了Java 9 定义,它们core看起来像这样:

module my.project.core {
   requires my.project.utils;
}
Run Code Online (Sandbox Code Playgroud)

但是我无法弄清楚如何让core测试类能够test-utils在测试执行期间看到类.当maven-surefire-plugin尝试测试运行时,我找不到课程.

如果我添加一个requires my.project.testutils;coremodule-info.java:

module my.project.core {
   requires my.project.utils;
   requires my.project.testutils; //test dependency
}
Run Code Online (Sandbox Code Playgroud)

然后在编译时我得到一个错误,my.project.testutils模块无法找到(大概是因为它只是作为测试依赖项引入).

如何在Java 9模块化世界中使用测试依赖项?出于显而易见的原因,我不希望我的主代码引入测试依赖项.我错过了什么吗?

Nam*_*man 5

对于maven和java9,如果您my.project.testutils是测试范围依赖项,则不需要requires在模块描述符中显式包含()它。


测试依赖项是通过类路径本身来处理的。所以你可以简单地删除它testutils,它会在执行测试时由 Maven 修补。

module my.project.core {
   requires my.project.utils;
}
Run Code Online (Sandbox Code Playgroud)

请参阅有关 maven-compiler-plugin 的幻灯片 30。

在此输入图像描述

我还建议您查看Where should I put unit test when migating a Java 8 project to Jigsaw以及Robert 的评论,确认了 maven 遵循的实现。

编辑:创建了一个示例项目,进行类比,主模块与您的相同core,依赖项guava与您的相同utilsjunit依赖项与您的相同testutils