【发布时间】:2019-12-08 15:45:12
【问题描述】:
我正在尝试将大型 code base 从 Java 8 迁移到模块化 (JPMS) Java 11,我遇到了巨大的痛苦,并在项目结构和如何使用模块信息方面找到了一致的建议实际生产项目的文件很难。
有问题的项目遵循源文件和测试文件的常规 gradle 结构:
src/main/java/org/abc/...
src/test/java/org/abc/...
我在src/main/java/module-info.java 中有一个module-info.java 文件,这是正确的位置吗?模块化 java 的 quick-start 和 this 似乎与此相矛盾;但是 other resources 按照我的方式做。
尝试运行如下所示的单元测试时:
@RunWith(MockitoJUnitRunner.class)
public class ABCTest {
@Mock
public SomeClass mock;
...
}
我明白了:
Unable to make field public SomeClass mock accessible: module org.abc does not "exports org.abc"
to module org.mockito
这表明我需要在我的module-info.java 文件中添加exports org.abc to org.mockito 但这似乎很笨重而且必须对我的测试树中甚至不是模块一部分的所有子包执行此操作,而且看起来喜欢做错的地方,因为测试不应该与发布 jar 一起导出。
我could find 看似最新的指导建议将module-info.[test|java] 文件添加到我的测试树中。这两个文件(.java 和 .test)有什么区别?我在谷歌上找不到任何解释这一点的文章。另外,我应该将内容从main/java/module-info.java 复制到test/java/module-info.test 并保持同步?这似乎很乏味。
我也知道 gradle 还没有对模块化 java 的原生支持,为此必须依赖插件,应该使用哪些“事实上的”插件?
我对可用的信息感到困惑,这似乎是矛盾的,非常低级或在使用 gradle 时不适用。有人可以提供一个使用 mockito、junit、gradle 和模块化 java(版本 9+,最好是 11)的传统源代码布局的示例项目吗?
【问题讨论】:
-
情况似乎还不清楚。但是已经有dzone.com/articles/…之类的文章了。相关:stackoverflow.com/questions/59117333/…
-
即使你解决了一个访问问题,你也会遇到
InvalidModuleDescriptorException;由xpp3:xpp3_min:1.1.4c工件引起。 JPMS 确定它是无效模块,因为它包含格式错误的服务提供者配置文件。它是少数经常遇到的工件之一,这些工件是任何 JPMS 项目的祸根,不幸的是它们最终会出现在模块路径上。唯一明智的解决方案是重构您的应用程序以使用不同的 XML Pull Parser。 StAX 例如。这是java.xml模块中的 JDK 内置的。
标签: java gradle junit mockito java-module