多模块(POM)和Java模块系统的区别

20

我试图理解使用Java平台模块系统(JPMS)和使用多POM结构化项目之间的区别。

主要区别是JPMS封装了代码,而多POM项目则将项目依赖项分离?

我在谷歌上搜索过,但没有找到好的解释,只看到模块一词被交替使用。

1个回答

27

计算机行业经常回收术语。上下文是关键。

您提出的“模块”两种类型是不相关的,正交的问题。

  • Java平台模块系统(JPMS)是一种在运行时标识Java编译器名称空间中所有可用类和方法的方法。
  • Apache Maven中的多模块是一种将可以作为单独项目处理的内容合并为一个项目的方法。项目中的每个模块都有自己的POM,具有自己的依赖项和构建设置,但是当它们作为Maven多模块组合时,所有模块都可以作为一个超级项目进行管理。每个模块都会生成一个artifact,例如JARWAR文件。

在Java中非常简单的应用程序可能都不使用这两种方法。

  • 理想情况下,新的Java应用程序将使用JPMS,但它仍然是可选的。在完美的世界中,JPMS本应包含在最初的Java中,但事实上,它只是最近在Java 9中添加的。如果您的应用程序将作为独立运行,并捆绑了JVM,那么JPMS非常方便,因为您可以包含已经剥离到实际使用的部分的JVM(请参见由JPMS启用的jlinkjpackage和相关工具)。
  • Maven多模块项目通常仅用于复杂项目,例如包括可能被拆分用于其他项目的功能的应用程序。或者,多模块Maven项目可能适用于将前端用户界面模块与后端业务逻辑模块组合在一起的应用程序,在这种情况下,我们希望单独管理每个部分,但将它们组合成一个单一的可交付项,例如Vaadin Flow Web应用程序。
我能理解你可能会感到困惑,因为两者都涉及到类的排列。简单来说,Maven模块是关于编译时(依赖管理和构建自动化),而Java平台模块系统则是关于运行时。

我读过Gradle更擅长管理多模块项目。对于你的多模块项目,你可以考虑从Maven转换到Gradle。Gradle从Maven仓库获取你的依赖。


你在评论中问道:

如果你需要将一个庞大的遗留应用程序拆分成几个应用程序,你会采取多模块方法还是JPMS方法?

再次强调,项目模块和JPMS是不同的问题。

您可以在将遗留应用程序项目拆分为单独的应用程序项目之前或之后使用JPMS进行模块化。

关于项目结构:

  • 如果您想将遗留应用程序的每个部分作为完全独立的应用程序交付,则无需使用多模块项目;将它们制作成实际的独立项目即可。
  • 如果您想在仍然交付单个构件(应用程序)的同时分别管理每个遗留应用程序大块的依赖项和构建自动化,则使用Maven多模块项目(或Gradle多模块项目)。

非常感谢您的解释。根据上述内容,如果您必须拆分一个旧的单体应用程序,该应用程序实际上是几个应用程序合并而成,您会采取多模块方法还是JPMS方法?我猜测是多模块方法,但很重视您的见解。 - reactFullStackDeveloper
1
如果您想将遗留应用程序的每个块作为实际分开的应用程序交付,那么无需使用多模块,而是将它们制作为实际独立项目。 如果您想在最后仍然提供单个构件(应用程序)的情况下单独管理遗留应用程序的每个大块的依赖关系和构建自动化,则可以使用Maven多模块。 - Basil Bourque
1
@reactFullStackDeveloper 对于现有的大型Java应用程序,使用JPMS可能没有立即的好处。我肯定不会同时对Maven多模块和JPMS进行重构。首先进行Maven重新组织。如果您的应用程序捆绑了JVM,则稍后考虑重新组织代码以符合JPMS,并学习如何使用jlink等将应用程序与精简的JVM一起交付。 - Basil Bourque

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