带有Gradle,JUnit和Mockito的模块化Java的推荐项目结构

问题描述 投票:1回答:2

我正在尝试将大型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-startthis似乎矛盾。但是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)的常规源代码布局吗?

java gradle junit mockito java-module
2个回答
0
投票

您已经发现,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中使用测试项目...

  1. 将项目导入Eclipse

  2. 在Eclipse的:eclipse视图中执行Gradle Tasks任务

    • 这是触发mrJarEclipse Modulefication
    • 功能的原因
  3. 打开项目的属性对话框

    • 转到Java Build Path属性选项卡
    • 注意标题栏中的通知(Not all modules could be found. Click Apply to synchronize
    • 单击Apply按钮以同步模块路径
  4. 执行:test任务

    • 或者,从Run As Gradle Test上下文菜单中执行Package Explorer
    • 或可替代地,执行:check
    • 任务是与:eclipse:test[ C0]
  5. [Run As Gradle Test可能有助于阐明在Eclipse中运行单元测试和JavaFX应用程序所需的步骤。

    希望您会发现附带的测试项目非常简单。但是,如果遇到麻烦,则有更详细的使用说明和屏幕录像The recording

我也很高兴与您一起参与该论坛讨论,并澄清在视频或任何步骤中可能不明显的内容。


另外,in this Gradle Communnity Forum thread具有项目的完全启用JPMS的副本@EmilyL ...

here's a github repository

我的另一个答案是对您的回答“

有人可以提供一个示例项目,该示例项目使用模仿,junit,gradle和模块化Java(版本9+,最好是11)吗?

“请求。
但是您可能还希望在标题中回答问题。

TL; DR

:您遇到的两个目录结构都是同样的legal。但是对于单模块项目,只需要常规的[[JPMS Modules Made Easy

长答案

] >>鲜为人见的src/main/java结构是一种在与模块同名的文件夹中整洁地组织模块的方法。然后,该模块的软件包将照常进入该平面模块名称目录。

然而,这不仅是一种风格选择。以不太典型的方式来组织模块有一些实用的技术优势。

JPMS

src/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目录中;并在其下镜像了包层次结构。

0
投票
我的另一个答案是对您的回答“

有人可以提供一个示例项目,该示例项目使用模仿,junit,gradle和模块化Java(版本9+,最好是11)吗?

© www.soinside.com 2019 - 2024. All rights reserved.