带Gradle、JUnit和Mockito的模块化Java的推荐项目结构
我正在尝试将一个大型项目从Java8迁移到模块化(JPMS)Java11,我遇到了巨大的困难,并且很难找到关于项目结构和如何在实际生产项目中使用模块信息文件的一致建议 该项目遵循源文件和测试文件的传统gradle结构:带Gradle、JUnit和Mockito的模块化Java的推荐项目结构,java,gradle,junit,mockito,java-module,Java,Gradle,Junit,Mockito,Java Module,我正在尝试将一个大型项目从Java8迁移到模块化(JPMS)Java11,我遇到了巨大的困难,并且很难找到关于项目结构和如何在实际生产项目中使用模块信息文件的一致建议 该项目遵循源文件和测试文件的传统gradle结构: src/main/java/org/abc/... src/test/java/org/abc/... 我在src/main/java/module info.java中有一个module info.java文件,这是正确的位置吗?对于模块化java来说,这似乎与此相矛盾;然而
src/main/java/org/abc/...
src/test/java/org/abc/...
我在src/main/java/module info.java
中有一个module info.java
文件,这是正确的位置吗?对于模块化java来说,这似乎与此相矛盾;然而,你要像我那样做
尝试运行如下所示的单元测试时:
@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到org.mockito
,但对于我的测试树中甚至不属于模块的所有子包,这样做似乎既笨拙又冗长,而且它似乎是一个错误的地方,因为测试不应该与发布jar一起导出
我建议在我的测试树中添加一个模块信息。[test | java]
文件,这似乎是最新的指导。这两个文件(.java
和.test
)之间有什么区别?我在谷歌上找不到任何解释这一点的链接。此外,我还必须将内容从main/java/module info.java
复制到test/java/module info.test
并保持同步?这似乎很乏味
我也知道gradle还没有对模块化java的本机支持,因此必须依赖插件,应该使用什么样的“事实上”插件
我被可用的信息弄糊涂了,它似乎是矛盾的,非常低的级别,或者在使用gradle时不适用。有人能提供一个使用mockito、junit、gradle和modular java(版本9+,最好是11)的传统源代码布局的示例项目吗?正如您所发现的,gradle没有内置的对JPMS的开箱即用支持 Gradle的JPMS策略可以总结为Gradle的核心开发人员之一 “目前还没有开展拼图支持的短期计划,因此请不要屏息以待…” 不过我已经发展了 这是通过Gradle、JPMS、JavaFX13、JUnit4和Mockito实现的。支持JPMS开发的插件将这一切联系在一起 您可以从命令行运行该测试项目的
:test
任务或:run
任务,或者按照以下步骤在Eclipse中使用该测试项目
- 可能有一些价值
Gradle Tasks
视图中执行:eclipse
任务
- 这就是触发mrJar的eclipsemodulefication特性的原因
- 转到
properties选项卡Java构建路径
- 请注意标题栏中的通知(
)找不到所有模块。单击“应用”以同步
- 单击
按钮以同步模块路径Apply
:test
任务
- 或者,从
上下文菜单中执行软件包浏览器
作为梯度测试运行
- 或者,执行
任务是另一个选项,它与:check
、:Eclipse
和:test
具有相同的Eclipse模块化效果作为渐变测试运行
另外,有了一个完全支持JPMS的项目@EmilyL副本
我的另一个答案是对您的“是否有人能提供一个使用mockito、junit、gradle和modular java(版本9+,最好是11)的传统源代码布局的示例项目?”请求的回应 但你可能还想在标题中找到问题的答案 TL;DR:您遇到的两种目录结构都同样合法。但对于单模块项目,您只需要使用传统的
src/main/java
长答案
不太常见的src/com.foo.mymodule/io/bar/apapackage
结构是一种将模块整齐有序地组织在与模块同名的文件夹中的方法。然后模块的包像往常一样放在该平面模块名目录中
然而,这不仅仅是一种风格上的选择。以不太典型的方式组织模块有一些实用的技术优势
JPMS--module source path
命令行选项可以一次编译多个不同的模块
.
.
└── src
├── com.foo.mymodule
│ ├── module-info.java
│ └── io
│ └── bar
│ └── apackage
│ ├── *.java
│ └── ...
├── net.other.module
│ ├── module-info.java
│ └── org
│ ├── example
│ │ └── yadda
│ │ ├── *.java
│ │ └── ...
│ └── another
│ └── pkg
│ ├── *.java
│ └── ...
├── mr.jar
│ ├── module-info.java
│ └── com
│ └── lingocoder
│ └── plugin
│ ├── *.java
│ └── ...
├── and.so.forth
└── ...
然后javac-dmods——模块源路径src…
可以编译嵌套在src
下的所有模块的所有代码
它将镜像src
下的目录结构,同时将生成的类文件存储在目标目录中(mods
,在我的示例中)
例如,为
net.other.module
模块生成的所有类文件都将存储在mods/net.other.module
目录中;包层次结构映射在该目录下。似乎情况还不清楚。但是已经有类似.Related:的文章,即使您解决了该问题