我正在尝试迁移大型 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
文件,这是正确的位置吗? quick-start对于模块化 java 和 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 一起导出。
看似最新的指导 I could find建议将 module-info.[test|java]
文件添加到我的测试树中。这两个文件(.java
和 .test
)有什么区别?我在谷歌上找不到任何解释这一点的点击。另外,我应该必须将内容从 main/java/module-info.java
复制到 test/java/module-info.test
并保留它们同步中?这看起来很乏味。
我还了解到 gradle 还没有对模块化 java 的 native 支持,并且必须依赖插件来实现这一点,应该使用哪些“事实上的”插件?
我对可用的信息感到困惑,它似乎是矛盾的,水平非常低或在使用 gradle 时不适用。有人可以提供一个使用mockito、junit、gradle 和模块化java(版本9+,最好是11)的常规源布局示例项目吗?
最佳答案
正如您所发现的,Gradle 没有内置的对 JPMS 的开箱即用支持。
Gradle 的 JPMS 政策可以总结为 this comment来自 Gradle 核心开发人员之一...
block 引用>„...There's no short-term plan to work on jigsaw support, so please don't hold your breath...“
我开发了a plugin that JPMS-enables Gradle and Eclipse不过。
Here is a simple test project它是使用 Gradle、JPMS、JavaFX 13、JUnit 4 和 Mockito 实现的。 The mrJar JPMS 开发支持插件将这一切联系在一起。
您可以运行
:test
任务或:run
仅使用原始 Gradle 从命令行执行该测试项目的任务。或者按照以下步骤在 Eclipse 中使用测试项目...
将项目导入 Eclipse
- this screen recording可能有一定的值(value)
执行
:eclipse
Eclipse 中的任务Gradle Tasks
查看
- 这就是触发 mrJar 的 Eclipse Modulefication 功能的原因
打开项目的属性对话框
- 转到
Java Build Path
属性选项卡- 注意标题栏中的通知 (
Not all modules could be found. Click Apply to synchronize
)- 点击
Apply
按钮同步模块路径执行
:test
任务
- 或者,
Run As Gradle Test
来自Package Explorer
上下文菜单- 或者再次执行
:check
任务是另一个选项,它具有与:eclipse
相同的 Eclipse Modulefication 效果。 ,:test
和Run As Gradle Test
The recording可能有助于阐明在 Eclipse 中运行单元测试和 JavaFX 应用程序所需遵循的步骤。
希望您会发现随附的测试项目非常简单。但如果你遇到困难,还有更详细的使用说明和屏幕录制in this Gradle Communnity Forum thread 。
我也很高兴在该论坛帖子中与您互动,并澄清视频或任何步骤中可能不明显的任何内容。
<小时/>此外,here's a github repository带有完全支持 JPMS 的项目副本 @EmilyL...
关于java - 使用 Gradle、JUnit 和 Mockito 的模块化 Java 的推荐项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59237083/