当前位置: 首页 > 知识库问答 >
问题:

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

闾丘坚诚
2023-03-14

我正在尝试将一个大型代码库从Java 8迁移到模块化(JPMS) Java 11,我遇到了巨大的困难,并且很难找到关于项目结构以及如何将模块信息文件用于实际生产项目的一致建议。

有问题的项目遵循源文件和测试文件的传统分级结构:

src/main/java/org/abc/...
src/test/java/org/abc/...

我有一个module-info.java文件在src/main/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

这表明我需要在我的< code>module-info.java文件中添加< code > exports org . ABC to org . mock ITO ,但是对于我的测试树中甚至不是模块的一部分的所有子包来说,这样做似乎是笨拙而冗长的,并且似乎是错误的地方,因为测试不应该用release jar导出。

我能找到的最新的指导建议是添加<code>模块信息。[test|java]文件到我的测试树。这两个文件(.java.test)之间有什么区别?我在谷歌上找不到任何解释这一点的点击。此外,我还必须从<code>main/java/module信息中复制内容。java到测试/java/module信息。测试并保持它们同步?这看起来很乏味。

我也知道gradle还没有对模块化java的本地支持,人们必须依赖插件来实现这一点,什么是人们应该使用的“事实上的”插件?

我对可用的信息感到困惑,它似乎相互矛盾,非常低的水平或在使用gradle时不适用。有人能提供一个使用mockito、jUnit、gradle和模块化java(版本9,最好是11)的常规源布局的示例项目吗?

共有2个答案

金昂熙
2023-03-14
匿名用户

我的另一个回答是对你的“有人能提供一个使用mockito、junit、gradle和模块化java(第9版,最好是第11版)的传统源代码布局的示例项目吗?”“请求。

但是你可能也想知道标题中问题的答案。

太长别读:您遇到的两种目录结构都同样合法。但是对于单个模块项目,您只需要传统的src/main/java

冗长的答案

不太常见的< code > src/com . foo . my module/io/bar/apakage 结构是一种将模块组织到与模块同名的文件夹中的好方法。然后,模块的包像往常一样放在这个简单的模块名目录中。

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

JPMS--mode-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下的所有模块的所有代码。

它将镜像< code>src下的目录结构,同时将生成的类文件存储在目标目录中(在我的示例中是< code>mods)。

例如,为< code>net.other.module模块生成的所有类文件都存储在< code > MODS/net . other . module 目录中;包的层次结构反映在它的下面。

郑晨
2023-03-14

正如您所发现的,Gradle没有内置的对JPM的开箱即用支持。

Gradle的JPMS策略可以通过其中一个Gradle Core Devs的评论来总结…

„...没有短期计划致力于拼图支持,所以请不要抱太大希望..."

不过,我开发了一个JPMS启用Gradle和Eclipse的插件。

下面是一个简单的测试项目,使用Gradle、JPMS、JavaFX13、JUnit4和Mockito实现。mrJar JPMS开发使能插件将其联系在一起。

您可以仅使用raw Gradle从命令行运行该测试项目的< code>:test任务或< code>:run任务。或者按照以下步骤在Eclipse中使用测试项目...

> 将项目导入到Eclipse中

    < li >此屏幕记录可能有一些价值

在eclipse的< code>Gradle Tasks视图中执行< code>:eclipse任务

  • 这就是触发mrJar的日食模块功能的原因

打开项目的属性对话框

  • 转到“Java 构建路径”属性选项卡
  • 请注意标题栏中的通知(并非所有模块都可以找到。单击应用进行同步
  • 单击应用按钮以同步模块路径

执行:测试任务

  • 或者,从包资源管理器上下文菜单中执行“以评分方式运行测试
  • 或者,再次执行 :check 任务是另一个选项,它与 :eclipse: 测试和“作为分级测试运行”具有相同的 Eclipse 模块化效果

记录可能有助于阐明在Eclipse中运行单元测试和JavaFX应用程序所需遵循的步骤。

希望你会发现附加的测试项目非常简单。但是如果你陷入困境,在这个Gradle社区论坛线程中有更详细的使用说明和屏幕记录。

我也很高兴在论坛中与你交流,澄清任何在视频或任何步骤中可能不明显的事情。

另外,这是一个github存储库,其中包含您的项目@EmilyL的完全支持JPMS的副本...

 类似资料:
  • 我继承了一个使用Python作为主要语言的GCP项目。这是我第一次接触GCP,我担心就最佳实践而言,该项目的结构可能不合理。 该项目由应用引擎(标准)组成,用于公开几个供web应用使用的HTTPendpoint,以及几个“触发”云函数,这些函数被部署用于处理需要后端处理的各种情况,例如:对象上传到bucket。目前,项目代码库包含应用程序引擎代码和云功能代码。 代码结构如下: 我们正在使用GCP

  • 主要内容:1- 介绍,2- 示例模型,3-创建项目数学库,4- 创建另一个项目:MathWebApp,5- 创建GradleMain项目,6- 构建项目,7- 运行MathWebApp1- 介绍 本教程文章基于: Eclipse Java EE IDE for Web Developers. Version: Mars.1 Release (4.5.1) 如果您是初学者Gradle的。那么建议先看看初学者Gradle(Gradle Hello world)的文章: http://www.yiib

  • 我是Spring靴的初学者。我参与了一个项目的开始,在这个项目中,我们将使用Spring引导构建Rest服务。当构建一个只公开其余服务的项目时,您能建议遵循推荐的目录结构吗?

  • 我想在Eclipse中的Java9模块化项目上使用JUnit5运行测试,而不使用Maven、Gradle或所有那些花哨的东西。因此,我有路径,其中module-info.java和模块的包所在,还有所有测试类所在。Id est业务照常,在拼图模块系统之前。我有Eclipse Oxygen.3a(4.7.3a)和Java 10.0.1。 我看过一些来自Eclipse的视频,展示了如何将JUnit测试

  • 问题内容: Java 9 已弃用了六个包含Java EE API的模块,它们将很快被删除: 哪些维护的第三方工件提供了这些API?它们提供这些API的性能如何或它们必须提供哪些其他功能都没关系-重要的是,它们是这些模块/软件包的直接替代品吗? 为了更轻松地收集知识,我用到目前为止的知识进行了回答,并将答案设置为社区Wiki。我希望人们能扩展它而不是自己写答案。 在你投票关闭之前: 是的,各个模块上

  • Java9不推荐使用包含Java EE API的六个模块,它们将很快被删除: java.activation与包 java.corba带有、、和包 java.transaction,带有包 java.xml.bind与所有包一起 java.xml.ws(带有、、以及所有包) java.xml.ws.annotation与包 为了让收集KnowWeldge更容易,我用我目前所知道的来回答,并把答案做