JPMS:Java平台模块系统
JPMS是Java平台模块系统的缩写。它是Java 9中的新特性。借助Java模块系统,我们可以将我们的Java应用程序和Java包打包到Java模块中。Java模块允许我们指定哪些模块的包和其他Java模块可以看到。Java模块还列出了它运行所需的Java模块。
Java平台系统也被称为Java Jigsaw或项目Jigsaw。Jigsaw是它开发时使用的名称。开发此系统的主要目的是使JRE更具模块化。JPMS主要解决了一些重大问题,包括类路径/ JAR地狱,庞大的单体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文件的情况下使用库 |
只能添加非模块化库 | 可以添加模块化和非模块化库 |
封装和抽象性较弱 | 封装和抽象性较强 |
模块化较弱 | 模块化较强 |
通过在类路径中添加库无法将库的一部分添加到项目中 | 只能通过在模块路径中添加所需的库的部分来添加到项目中 |
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)在其初始开发阶段。它使开发人员更容易组织大型应用程序和库。它改进了结构并增加了平台的安全性水平。它还用于改善应用程序性能,并对平台进行分解以适应更小的设备。其主要思想是使相关包的集合对模块可见,而将元素隐藏在模块外部消费者中。