JPMS:Java 平台模块系统

javaobject oriented programmingprogramming更新于 2024/11/8 13:00:17

JPMS 代表 Java 平台模块系统。它是 Java 9 中的新功能。我们的 Java 应用程序和 Java 包可以借助 Java 模块系统打包到 Java 模块中。Java 模块允许我们指定模块的哪些包和其他 Java 模块应该能够看到。Java 模块还列出了它运行所需的 Java 模块。

Java 平台系统也称为 Java Jigsaw 或 Project Jigsaw。Jigsaw 的名称在开发时使用。开发它的主要目的是使 JRE 更加模块化。 JPMS 解决了几个主要问题,即 Classpath/JAR Hell、大规模单片 JDK、版本冲突、安全问题。

现在,让我们更深入地了解 Java 平台模块化系统,以了解有关它们的更多信息。

为什么 Java 需要模块?

重要的是要记住,JPMS 是 SE(标准版)功能,并且会影响 Java 的各个级别。尽管如此,该补丁旨在使大多数程序在从 Java 8 切换到 Java 9 时无需修改即可运行。其主要目的是使模块可见的相关包能够聚集在一起,同时向模块的外部消费者隐藏一些组件。

JPMS 的推出具有以下既定目标 -

  • 易于组织大型应用程序和库。

  • 提高安全性

  • 提高应用程序性能

  • 管理小型设备的平台故障。

  • 改进结构。

类路径 VS 模块路径

到目前为止,类路径一直是 Java 中执行程序时可访问内容的主要决定因素。尽管类路径发挥了这一作用并且众所周知,但它最终会变成一个巨大的、未分化的存储桶,所有依赖项都插入其中。

模块路径在类路径上方添加了一个级别。它充当包的存储空间,并选择应用程序可以访问哪些包。

类路径

模块路径

适用于所有 Java 版本

仅适用于 Java 9 及以上版本

不需要 module-info.java

需要 module-info.java

仅当项目没有时,添加库才有效module-info.java

库可以在没有 module-info.java 的情况下工作

仅添加非模块化库

模块化和非模块化都可以添加

封装和抽象较弱

封装和抽象较强

模块化较弱

模块化很强

无法通过在 classpath 中添加库的一部分将其添加到项目中

我们只能通过在 modulepath 中添加库的所需部分将其添加到项目中

JAVA 中的模块

JDK 由模块组成。如果您在系统上使用 JDK,那么您也有源代码。如果您不知道这一点,请查看此处以了解更多信息。

JDK 安装目录中有一个 /lib 目录。在该目录中,您将找到一个 src.zip 文件。然后将其解压缩到 /src 目录中。之后查看 /src 目录并找到 /java.base 目录,然后您将找到 module-info.java 文件并最后将其打开。

在顶部的 Javadoc 注释之后,您将找到一个名为 module section.base 的文件夹,后面是 exports 行。格式有点深奥,所以我们不会深入讨论。

如您所见,java.base 模块导出了几个众所周知的 Java 包,包括 java.io。这就是收集包的模块的工作原理。

指令的要求与导出相反。因此,模块可能是正在指定的模块所必需的。您可以像在针对模块运行 Java 编译器时提供类路径一样指定模块路径。这使得解决依赖关系成为可能。

向后兼容性

Java 9 在创建时就考虑到了向后兼容性。然而,新的模块结构是一个重大的转变,您可能会遇到问题,尤其是在大型代码库中。

以下命令可能对源自代码库的问题有用 - 当命令 jdeps 指向某个类时,它将查找任何依赖项和需要依赖项的模块。

如果您的依赖项导致问题,您可以希望您所依赖的包具有符合 Java 9 的更新版本。如果没有,您可能需要寻找选项。

常见错误

如何解决 java.lang.NoClassDefFoundError -

Javax/xml/bind/JAXBException

这是代码抱怨未找到分配的类,因为它已迁移到模块,而使用代码无法看到它。对此有几种解决方案。

JPMS 是一个相当重大的转变,因此采用需要一些时间。幸运的是,由于 Java 8 是一个长期支持版本,因此没有迫切的需求。

然而,从长远来看,旧项目需要迁移,新项目必须明智地使用模块,以便获得一些已经给出的好处。

结论

JPMS 代表 Java 平台模块系统,在其开发初期也称为项目拼图。它使开发人员更容易组织大型应用程序和库。它改进了结构并提高了平台的安全级别。它还用于提高应用程序性能,并且对于较小设备的平台分解很有用。这背后的主要思想是启用对模块可见的相关包的集合,同时隐藏模块上外部消费者的元素。


相关文章


有用资源