有人可以提供一个示例项目,该示例项目使用模仿,junit,gradle和模块化Java(版本9+,最好是11)吗?
我正在尝试将大型code base从Java 8迁移到模块化(JPMS)Java 11,并且遇到了很大的麻烦,并且在项目结构和如何使用模块信息文件方面找到了一致的建议实际的生产项目很难。
该项目遵循用于源文件和测试文件的常规gradle结构:
src/main/java/org/abc/...
src/test/java/org/abc/...
我在module-info.java
中有一个src/main/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
这表明我需要在我的exports org.abc to org.mockito
文件中添加module-info.java
,但这似乎很笨拙,不得不对我的测试树中的所有子包(甚至不是模块的一部分)执行此操作,错误的位置,因为不应将测试与发布jar一起导出。
could find看似最新的指南建议向我的测试树中添加module-info.[test|java]
文件。这两个文件(.java
和.test
)有什么区别?我在Google上找不到任何说明这一点的点击。另外,我还必须将内容从main/java/module-info.java
复制到test/java/module-info.test
并使它们保持同步?这似乎很乏味。
[我也了解gradle尚不支持模块化Java,并且必须为此而依赖插件,一个应该使用的“事实上的”插件是什么?
我对可用的信息感到困惑,它看起来很矛盾,级别很低,或者在使用gradle时不适用。有人可以提供一个示例项目,该项目具有使用模仿,junit,gradle和模块化Java(版本9+,最好是11)的常规源代码布局吗?
您已经发现,Gradle没有内置的对JPMS的现成支持。
Gradle的JPMS策略可以由[Gradle Core Devs之一的this comment总结...
„ ... 目前尚无短期计划来支持拼图,所以请不要屏住呼吸 ...”
虽然我开发了a plugin that JPMS-enables Gradle and Eclipse。
Here is a simple test project由Gradle,JPMS,JavaFX 13,JUnit 4和Mockito实现。The mrJarJPMS支持开发的插件将它们联系在一起。
您可以仅使用原始Gradle从命令行运行该测试项目的:test
任务或:run
任务。或按照以下步骤在Eclipse中使用测试项目...
将项目导入Eclipse
在Eclipse的:eclipse
视图中执行Gradle Tasks
任务
打开项目的属性对话框
Java Build Path
属性选项卡Not all modules could be found. Click Apply to synchronize
)Apply
按钮以同步模块路径执行:test
任务
Run As Gradle Test
上下文菜单中执行Package Explorer
:check
:eclipse
,:test
和[ C0]Run As Gradle Test
可能有助于阐明在Eclipse中运行单元测试和JavaFX应用程序所需的步骤。希望您会发现附带的测试项目非常简单。但是,如果遇到麻烦,则有更详细的使用说明和屏幕录像The recording。
我也很高兴与您一起参与该论坛讨论,并澄清在视频或任何步骤中可能不明显的内容。
有人可以提供一个示例项目,该示例项目使用模仿,junit,gradle和模块化Java(版本9+,最好是11)吗?
TL; DR
:您遇到的两个目录结构都是同样的legal。但是对于单模块项目,只需要常规的[[。长答案
] >>鲜为人见的src/main/java
结构是一种在与模块同名的文件夹中整洁地组织模块的方法。然后,该模块的软件包将照常进入该平面模块名称目录。然而,这不仅是一种风格选择。以不太典型的方式来组织模块有一些实用的技术优势。
JPMSsrc/com.foo.mymodule/io/bar/apackage
--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 -d mods --module-source-path src ...
src
下镜像目录结构,同时将生成的类文件存储在目标目录中(在我的示例中为src
mods
模块生成的类文件将存储在net.other.module
目录中;并在其下镜像了包层次结构。有人可以提供一个示例项目,该示例项目使用模仿,junit,gradle和模块化Java(版本9+,最好是11)吗?