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

带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来说,这似乎与此相矛盾;然而

我正在尝试将一个大型项目从Java8迁移到模块化(JPMS)Java11,我遇到了巨大的困难,并且很难找到关于项目结构和如何在实际生产项目中使用模块信息文件的一致建议

该项目遵循源文件和测试文件的传统gradle结构:

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中使用该测试项目

  • 将项目导入Eclipse

    • 可能有一些价值
  • 在eclipse的
    Gradle Tasks
    视图中执行
    :eclipse
    任务

    • 这就是触发mrJar的eclipsemodulefication特性的原因
  • 打开项目的“属性”对话框

    • 转到
      Java构建路径
      properties选项卡
    • 请注意标题栏中的通知(
      找不到所有模块。单击“应用”以同步
    • 单击
      Apply
      按钮以同步模块路径
  • 执行
    :test
    任务

    • 或者,从
      软件包浏览器
      上下文菜单中执行
      作为梯度测试运行
    • 或者,执行
      :check
      任务是另一个选项,它与
      :Eclipse
      :test
      作为渐变测试运行
      具有相同的Eclipse模块化效果
  • 可能有助于澄清在Eclipse中运行单元测试和JavaFX应用程序需要遵循的步骤

    希望您会发现附带的测试项目非常简单。但是如果您陷入困境,会有更详细的使用说明和屏幕记录

    我也很高兴与您在该论坛的线程,并澄清任何可能不明显的视频或任何步骤


    另外,有了一个完全支持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:的文章,即使您解决了该问题