假设我有一个使用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
等)?
module-info
在我看来没有意义?这背后有特殊的要求/成就吗? - khmarbaise