【发布时间】:2019-01-07 05:48:22
【问题描述】:
我正在将一个 jar 项目从使用类路径的 java 10 迁移到使用 java 9 jigsaw 模块的 java 11。 该项目有 JUnit5 测试。 测试依赖项由 maven 在测试范围内提供。 模块被其他项目使用时,如何让所有包都打开测试但不打开?
jar 项目只是为其他项目提供了一些类(如实用程序项目)(因此不需要主类)。
该项目在 /src/main/java/a/b/c/ 获得了 5 个包。 使用此 jar 的项目应该可以访问其中的 2 个。 其他 3 个仅供内部使用(由可访问的使用)。 测试位于 /src/test/java/a/b/c/。 这些测试在测试范围内提供了依赖项(JUnit、mockito、junt-params),因为这些测试与使用此 jar 的项目无关
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
我在 /src/main/java/ 提供了一个 module-info.java:
module moduleName {
requires java.base;
exports a.b.c.package1;
exports a.b.c.package3;
}
所以现在包 1 和 3 中的公共类应该可以按预期被其他项目访问(我还无法验证这一点)。
现在运行测试会导致 java.lang.reflect.InaccessibleObjectException: Unable to make a.b.c.package1.collections.SomeTest() 可访问:模块 moduleName 不会“打开 a.b.c.package1”到未命名的模块 @6a84a97d
当我打开包(使用 opens)时,一切运行顺利。 但是现在所有的包都打开了。 我希望包 2、4 和 5 只能在测试时访问,并且 1 和 3 不应该为反射打开(所以只能导出)。
我开始想,既然 maven 告诉我未命名的模块 @6a84a97d,这可能是为测试而创建的模块。 这让我尝试在 /src/test/java/ 添加一个 module-info.java 进行测试。
module moduleNameTest {
requires moduleName; // the code to test
requires java.base; // java.base could be transient on moduleName
// test dependencies
requires org.junit.jupiter.api;
requires org.junit.jupiter.params;
}
现在 maven (3.5.4) 状态:
src/test/java/module-info.java:[3,20] module not found: moduleName
src/test/java/module-info.java:[4,31] module not found: org.junit.jupiter.api
src/test/java/module-info.java:[5,31] module not found: org.junit.jupiter.params
技术:
- java openJDK 11
- MVN 3.5.4
- JUnit 5.3.0
- Surefire 插件 3.0.0-M3
- 模拟 2.21.0
如前所述,我希望包 2、4 和 5 只能在测试时访问,并且在使用 maven 构建 jar 时运行测试。包 1 和 3 应该导出用于其他项目,但不打开反射(所以只导出不打开)。
如果您需要更多信息,请随时询问。
提前致谢
凯文
【问题讨论】:
标签: java maven junit5 java-platform-module-system