JPMS:Java平台模块系统
JPMS代表Java平台模块系统。它是Java 9中的新特性。借助Java模块系统,我们的Java应用程序和Java包可以打包成Java模块。Java模块允许我们指定哪些模块的包和其他Java模块可以访问。Java模块还列出了其正常运行所需的Java模块。
Java平台系统也称为Java Jigsaw或Project Jigsaw。Jigsaw的名字在其开发时使用。开发它的主要目的是使JRE更加模块化。JPMS解决了一些主要问题,即类路径/JAR冲突、庞大的单体JDK、版本冲突、安全问题。
现在,让我们更深入地了解Java平台模块系统,以了解更多信息。
为什么Java需要模块?
重要的是要记住,JPMS是一个SE(标准版)特性,它在各个层面上影响Java。尽管如此,该补丁旨在使大多数程序在从Java 8切换到Java 9时无需修改即可运行。其主要目的是启用对模块可见的相关包的集合,同时隐藏模块外部使用者的一些组件。
JPMS发布时,其目标如下:
易于组织大型应用程序和库。
提高安全性
提高应用程序性能
管理平台的小型设备分解。
改进结构。
类路径与模块路径
到目前为止,类路径一直是确定在Java中执行程序时程序可以访问的内容的主要决定因素。尽管扮演着这个角色并且众所周知,但类路径最终变成了一个大型的、未区分的容器,所有依赖项都插入其中。
模块路径在类路径之上添加了一层。它充当包的存储空间,并选择哪些包对应用程序可见。
类路径 |
模块路径 |
---|---|
适用于所有Java版本 |
仅适用于Java 9及以上版本 |
不需要module-info.java |
需要module-info.java |
仅当项目没有module-info.java时,添加库才有效 |
库可以在没有module-info.java的情况下工作 |
仅添加非模块化库 |
可以添加模块化和非模块化库 |
封装和抽象较弱 |
封装和抽象较强 |
模块化较弱 |
模块化较强 |
无法通过将库添加到类路径中来将库的一部分添加到项目中 |
我们只能通过将库添加到模块路径中来将库的所需部分添加到项目中 |
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平台模块系统,在其最初的开发阶段也称为Project Jigsaw。它使开发人员更容易组织大型应用程序和库。它改进了结构并提高了平台的安全性。它还用于提高应用程序性能,并且对于小型设备的平台分解很有用。其背后的主要思想是启用对模块可见的相关包的集合,同时隐藏模块上外部使用者的元素。