Java多模块项目是否需要多个Gradle项目?

4

我开始接触Java模块化,并且想知道多模块项目是否应该拆分为子Gradle项目。如果是或不是这种情况,目录结构会是什么样子呢?我看到了一些关于非Gradle项目结构的冲突示例,例如:

reverse/dns/module/module-info.java 
                ./packages..
reverse/dns/module/module-info.java 
                ./packages..

并且

reverse.dns.module/
            module-info.java // module-info is in the root directory and its name corresponds to parent folder
            reverse/dns/module/packages..

它会像这样吗?

实际上,我只是想知道如果我有两个模块,如何构建Gradle项目结构。我还打算使用jlink创建映像,如果这与其他任何内容冲突,请告诉我。


1
这不是取决于你是否想要共享某个模块,还是仅在你设置的项目内部重要吗?在我们的代码库中,这些模块不应该被共享,因此我们只有一个单独的 module-info.java 文件... - Eugene
1
JUnit 5 广泛使用模块,并使用 Gradle 构建。我建议查看他们的存储库以获取想法/指导:https://github.com/junit-team/junit5 - Cisco
@FranciscoMateo 这不是一个公平的比较。据我所知,根据 此提交 ,这是为了能够在任何时候将普通的 JAR 转换为模块,而无需使它们成为自动模块。我怀疑这对 OP 来说永远都不是问题。 - Eugene
@joshpetit 如果你打算将它们作为单独的模块,那么就没有问题了。否则,如果你想要共享和封装——选择是显而易见的。我所说的“我们的代码”是指我们有一个单独的代码库来自每个微服务,它们有时确实使用共享代码,但这些共享代码是由一个单一的Gradle模块制作的。所以我想,这对我们来说更容易? - Eugene
@Eugene Ok,很有道理,对于你的代码库,所需的共享代码在一个gradle模块中。我尽量不过分担心结构(虽然有时候会过度担心哈哈),所以我已经决定将其分成两个子项目,如果将来发现更适合我的用例,我会尝试重新组织它。谢谢! - joshpetit
显示剩余2条评论
1个回答

0

我问了一个类似于这个问题的变体:

我正在使用gradle和jlink插件,并且有一个应用程序,我想将其拆分为两个模块,这些模块应该位于src/main/java目录下还是应该重构为src/mod1/和src/mod2/? 由此引发的另一个问题是测试以及放置junit测试类的位置。我主要关心所有这些的目录结构。谢谢!

我向Nick Maiorano提出了这个问题,并收到了以下回复:

对于您的第一个问题,Java编译器和运行时对此没有意见。它们支持任何类型的目录结构。但是像Intellij和Eclipse这样的Java编辑器会强制您为每个模块拥有单独的源根目录。如果您计划让不同的团队维护自己的模块,则必须拥有单独的源根目录,并且您将像使用第三方库一样使用它们的模块,通过jar或jmod文件进行模块依赖。否则,您可以在单个源下拥有不同的模块,但是您将与Eclipse / Intellij的模块支持作斗争(但是这是可能的)。

你的第二个问题要简单得多:单元测试类应该与它们的测试对象在同一个模块中。它们应该可以访问模块中的每个类,因此将它们作为模块的一部分是有意义的。它们应该位于单独的目录中,但与其测试对象具有相同的包名称(以便它们不会被阻止访问包私有方法)。
这符合我决定构建应用程序的方式,即通过拥有两个独立的Gradle子项目,每个项目都有自己的src/main/java目录。我的最终目录结构如下:
wit-core/
├── build.gradle
├── core.vim
└── src
    ├── main
    │   └── java
    │       ├── dev
    │       │   └── joshpetit
    │       │       └── wit
    │       │           └── core
    │       │               ├── base
    │       │               ├── interpret
    │       │               └── model
    │       └── module-info.java
    └── test
        └── java
            └── dev
                └── joshpetit
                    └── wit
                        └── core
                            ├── base
                            └── utils
wit-gui/
├── build.gradle
├── Session.vim
└── src
    ├── main
    │   └── java
    │       ├── dev
    │       │   └── joshpetit
    │       │       └── wit
    │       │           └── gui
    │       │               └── launcher
    │       └── module-info.java
    └── test
        └── java
            └── dev
                └── joshpetit
                    └── wit
                        └── gui
                            └── launcer

非常感谢与我一起解析这个问题的人们!

如果还有其他人对此有疑问,我建议遵循@FranciscoMatea的建议,并参考junit的项目结构。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接