Java9多模块Maven项目测试依赖

标签 java maven java-9 maven-surefire-plugin java-platform-module-system

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

核心有以下依赖定义

<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 尝试运行测试时,我得到类未找到。

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

module my.project.core {
   requires my.project.utils;
   requires my.project.testutils; //test dependency
}

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

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

最佳答案

使用 maven 和 java9,如果你的 my.project.testutils 是一个测试范围依赖,你不需要在模块中明确包含(requires)它描述符。


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

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

引用slide 30 pertaining to maven-compiler-plugin.

enter image description here

我还建议您看一下 Where should I put unit tests when migrating a Java 8 project to Jigsawthis comment由 Robert 确认 maven 遵循的实现。

编辑:创建了一个 sample project打个比方,主模块和你的core一样,对guava的依赖和你的utilsjunit 依赖与您的 testutils 相同。

关于Java9多模块Maven项目测试依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47146491/

相关文章:

java - JSP 页面显示 bean 为空值

java - 使用 Maven 和 Eclipse 制作我的第一个 Web 项目时遇到问题

java - 通过类变量调用时,Java 9 中的 Class.cast 和 Class.isInstance 方法实际上是固有的吗?

java - 在分离的 Java 平台模块中使用不同版本的依赖项

java - ArrayList 的 NullPointerException - 应该不可能?

java - Spring Security 3.2、CSRF 和多部分请求

java - 如何在 Processing 中将文本附加到 csv/txt 文件?

java - Maven - 缺少 Artifact

maven - Bamboo 阶段和 Maven 生命周期

java - 如何在运行时扩展模块路径