Java 9 + maven + junit : does test code need module-info. java 自己的,放在哪里?

标签 java maven junit java-9 java-module

假设我有一个使用 Maven 3 和 junit 的 Java 项目。 src/main/javasrc/test/java 目录分别包含主源和测试源(一切都是标准的)。

现在我想将项目迁移到 Java 9。src/main/java 内容代表 Java 9 模块; com/acme/project/module-info.java 看起来大概像这样:

module com.acme.project {
    require module1;
    require module2;
    ...
}

如果测试代码需要自己的 module-info.java 怎么办?例如,添加对仅用于测试而不是生产代码的某些模块的依赖。在这种情况下,我必须将 module-info.java 放到 src/test/java/com/acme/project/ 中,给模块一个不同的名称。这样 Maven 似乎将主源和测试源视为不同的模块,所以我必须将包从主模块导出到测试模块,并要求测试模块中的包,如下所示:

主模块(在 src/main/java/com/acme/project 中):

module prod.module {
    exports com.acme.project to test.module;
}

测试模块(在 src/test/java/com/acme/project 中):

module test.module {
    requires junit;
    requires prod.module;
}

这会产生

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:testCompile (default-testCompile) on project test-java9-modules-junit: Compilation failure: Compilation failure:
[ERROR] /home/rpuch/git/my/test-java9-modules-junit/src/test/java/com/acme/project/GreeterTest.java:[1,1] package exists in another module: prod.module

因为一个包被定义在两个模块中。所以现在我必须在主模块和测试模块中有不同的项目,这很不方便。

我觉得我走错了路,一切都开始变得很丑陋。如何在测试代码中拥有自己的 module-info.java,或者没有它如何实现相同的效果(require 等)?

最佳答案

模块系统不区分生产代码和测试代码,所以如果选择模块化测试代码,prod.moduletest.module不能共享相同的包 com.acme.project,如 specs 中所述:

Non-interference — The Java compiler, virtual machine, and run-time system must ensure that modules that contain packages of the same name do not interfere with each other. If two distinct modules contain packages of the same name then, from the perspective of each module, all of the types and members in that package are defined only by that module. Code in that package in one module must not be able to access package-private types or members in that package in the other module.

正如 Alan Bateman 所说,Maven 编译器插件使用 --patch-module and other options由模块系统在编译 src/test/java 树中的代码时提供,以便在被测模块中增加测试类。在运行测试类时,这也是由 Surefire 插件完成的(参见 Support running unit tests in named Java 9 modules)。这意味着您不需要将测试代码放在模块中。

关于Java 9 + maven + junit : does test code need module-info. java 自己的,放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46613214/

相关文章:

java - 玩! + 锡耶纳 + GAE + JUnit

Java斯坦福NLP : Find word frequency?

java - Maven:打包复制文件夹后复制粘贴WEB-INF到根目录

java - 在 Eclipse 中添加 M2_REPO 变量的问题

maven - 为什么我的 nexus metadata.xml 快照版本不正确?

java - Eclipse:必需的 '@Nonnull Type' 阻止 JUnit 测试

java - Java:序列化到字节缓冲区的最快方法

java - objectinputstream.readobject() 行 : not available [local variables unavailable]

java - 通过java检查我的服务器是否启动

java - 在初始化期间修改静态变量的单元测试