项目Jigsaw与Maven的比较

52

来自Jigsaw项目

使得开发人员更容易构建和维护Java SE和EE平台上的库和大型应用程序。

我正在尝试了解Jigsaw项目是什么,到目前为止,它似乎与我们使用Maven(或Gradle)依赖管理时的目标有所重叠:

  • 它是否威胁到类似于Maven的构建工具?
  • 或者我的理解是错误的,Jigsaw项目会以某种方式补充这些构建工具吗?

你看到了这篇帖子以及其中的答案,获取一些提示了吗? - A_Di-Matteo
@A_Di-Matteo 是的,我看过这个答案,但它似乎更与在Maven中使用JDK9有关。它没有说明如何使两者的依赖管理一起工作。 - justAbit
4
Jigsaw并不与Maven重叠,也不构成威胁,因为它们有不同的思路。Jigsaw旨在实现模块化(与OSGi有许多相似之处),但针对的是普通Java(SE)和EE。Jigsaw使得通过module-info文件中定义的已定义接口来解耦只能通过该接口访问的模块更加容易,并且这一点由javac编译器(jlink等)进行控制。 - khmarbaise
3
除了“威胁”一词会让这个问题变得有点棘手外,我自己也在考虑同样的问题。我认为大多数开发者想知道的是:这会影响使用Maven风格依赖进行普通Java开发吗?预计会有什么好处和变化? - clay
2个回答

43

非常简化的回答

Jigsaw之后,public只在JAR范围内公开。要在JAR外部查看类,必须导出它。

Java将强制模块化,因为任何模块间交互都必须在module-info文件中指定。

例如,如果您生成了一个WAR文件,它几乎不会改变,但是在WAR中打包的所有JAR包必须定义一个module-info(或不定义它并被视为自动或未命名模块)。

Maven有两个主要功能:依赖管理和构建:

  • 依赖管理意味着Maven可以确定库的版本并从存储库中下载它们。
  • 构建意味着Maven可以编译代码并将其打包成构件。

总之:Maven仍然负责构建,但必须学会使用Jigsaw模块进行编译和打包。


1
看起来Jigsaw也通过像requires这样的指令来管理依赖关系。这部分是否与maven/gradle重叠?对于从JDK 9开始工作的开发人员来说,正确的依赖关系管理方式是什么? - wlnirvana
1
例如,当一个模块“requires”第二个模块时,这意味着第二个模块必须在编译和运行时类路径上可用。Maven用于从存储库检索库,将其添加到编译类路径中,并将其添加到输出war / fatjar / docker层中。关于重叠:没有重叠:“requires”类似于“import”-需要通过编译/运行时,但如何获取“something”是构建工具的责任。 - michaldo

15

模块不会对构建工具造成威胁。模块是构建工具的补充,因为构建工具在构建时构造了一个依赖图,其中包含工件及其版本,而模块在构建时和运行时强制执行工件/模块的依赖关系(不包括版本)。

来自模块系统的现状

"A module’s declaration does not include a version string, nor
constraints upon the version strings of the modules upon which it
depends. This is intentional: It is not a goal of the module system
to solve the version-selection problem, which is best left to build
tools and container applications."

8
Jigsaw只是增加了额外的开销 :) - TriCore

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