假设我有一个使用 Maven 3 和 junit 的 Java 项目。有src/main/java
和src/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
没有它我如何实现相同的效果(等)?