我有一个项目“java11-core”,它生成一个测试 jar 工件以与项目“java11-app”共享。这些项目使用命令行 Maven 构建良好,但在 Eclipse 中,无法找到测试 jar 中共享的类。
版本信息:
- Apache Maven 3.6.0(命令行和 Eclipse)
- Java 版本:11.0.1,供应商:甲骨文公司
- Eclipse IDE:版本:2018-09 (4.9.0)
- M2E 插件:1.9.1.20180912-1601
我最初将这些项目创建为传统的非 JPMS 项目。这些项目按预期正常编译和运行测试。在我将 module-info.java 添加到 java11-core 和 java11-app 之后,Eclipse 编译器无法识别来自核心项目的共享测试文件。
这是项目结构概述的包资源管理器的快照。
分别添加了 java11-app 和 java11-core module-info 内容:
module com.java11.app {
exports com.java11.app;
requires com.java11.core;
}
module com.java11.core {
exports com.java11.core;
}
如您所见,我没有从 com.java11.core 导出测试实用程序包。我不想导出测试包,因为这会使测试类公开可用。我也不希望引入一个新的测试项目,因为在现实世界的场景中,这很可能需要测试实用程序和它们协助测试的项目之间的循环依赖关系。
AppTest.java 中的构建错误。Eclipse 报告的失败很有趣,它并没有声称找不到 CoreTestUtil 类,而是:
The type com.java11.test.core.util.CoreTestUtil is not accessible AppTest.java /java11-app/src/test/java/com/java11/app line 8 Java Problem
CoreTestUtil cannot be resolved AppTest.java /java11-app/src/test/java/com/java11/app line 21 Java Problem
我的假设是缺少从 java11-core 导出此包和/或在 java11-app 中缺少此包的要求使 eclipse 认为访问受到限制,即使这些类存在于单独的 test-jar 中.
java11-app 的模块路径显示它包含 java11-core 作为模块,并且无测试代码设置为No。
我知道我正在使用新发布的功能,并且怀疑跨 Eclipse JPMS 项目共享测试类尚不支持。但是,我不确定在哪里寻找支持的更新(Eclipse?M2E 插件)。我也不知道有一种变通方法可以让我在为我的软件项目采用 JPMS 时提高工作效率。
对于那些认为不应以这种方式共享测试实用程序的人...
这个主题被描述为一个最佳实践问题,应该通过将测试实用程序重构到一个单独的模块中来解决。我尊重这种观点,但在尝试遵循该指导时,我发现自己被迫违反其他最佳实践,包括 DRY(不要重复自己)和包之间的循环依赖关系。
在开发一个既有助于对该模块进行有效测试又依赖于该模块的模块时,通常会出现一个测试实用程序。如果这些实用程序被拉出到单独的模块,这将创建一个循环。此外,在测试依赖于该模块的其他模块时,其中一些实用程序同样有用。如果将这些实用程序复制到依赖项的新测试模块,则会创建重复代码。这个推理可能是最初添加 Maven 'test-jar' 支持的原因。