假设我有一个使用Maven 3和junit的Java项目。有src/main/java
和src/test/java
目录分别包含主要来源和测试来源,(一切都是标准的)。Java 9 + maven + junit:测试代码是否需要它自己的module-info.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似乎将主源和测试源视为不同的模块,所以我必须将包从主模块导出到测试模块,并且需要测试模块中的包,如下所示:
主模块(in 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
等)?
先忘记Maven 2 ...使用Maven 3 + ...测试中的'module-info'是否从我的角度来看没有意义?背后的特殊要求/成就? – khmarbaise
这是Maven 3,当然是 –