在本文中,我将介绍Java 9平台模块系统(JPMS),这是自Java诞生以来最重要的新软件工程技术。 模块化是Project Jigsaw的结果,可帮助各个级别的开发人员在构建,维护和发展软件系统(尤其是大型系统)时提高工作效率。
1.什么是模块?Module
模块化在软件包之上增加了更高级别的聚合。 新的关键语言元素是模块-唯一命名的,可重用的相关软件包组,以及资源(例如图像和XML文件)和一个模块描述符,用于指定:
- 模块名称
- 模块的依赖关系(即该模块依赖的其他模块)
- 它显式提供给其他模块的软件包(该模块中的所有其他软件包隐式地对其他模块不可用)
- 它提供的服务
- 它消耗的服务
- 可以反射到其他哪些模块
2.模块化的提出过程
Java SE平台自1995年以来一直存在。现在,大约有1000万开发人员使用Java SE平台来构建一切,从用于资源受限设备的小型应用程序(例如物联网(IoT)和其他嵌入式设备中的应用程序)到大规模 关键业务和关键任务系统。 那里有大量的遗留代码,但是直到现在,Java平台一直主要是一种单片式的“一刀切”的解决方案。 多年来,已经进行了各种努力来使Java模块化,但是没有一个被广泛使用,也没有一个可以用来对Java平台进行模块化。
实现Java SE平台的模块化一直很难实现,并且花费了很多年的时间。 JSR 277:Java模块系统最初是在2005年为Java 7提出的。此JSR后来被JSR 376:Java Platform Module System取代,并以Java 8为目标。JavaSE平台现在已在Java 9中模块化,但仅在Java 9之后 被推迟到2017年9月。
3.模块化的目标
根据JSR 376,对Java SE平台进行模块化的主要目标是
可靠的配置-模块化提供了一种机制,可以在编译时和执行时都可以识别的方式显式声明模块之间的依赖关系。系统可以遍历这些依赖性,以确定支持您的应用程序所需的所有模块的子集。
强大的封装能力-只有模块显式导出模块中的软件包,其他模块才能访问它们。即使那样,除非另一个模块明确声明需要其他模块的功能,否则它不能使用这些软件包。由于潜在的攻击者可以访问的类更少,因此可以提高平台安全性。您可能会发现考虑模块化可以帮助您提出更简洁,更合理的设计。
可扩展的Java平台-以前,Java平台是一个由大量软件包组成的整体,这使其在开发,维护和发展方面面临挑战。无法轻易将其细分。该平台现已模块化为95个模块(此数字可能会随着Java的发展而改变)。您可以创建仅包含应用或目标设备所需的模块的自定义运行时。例如,如果设备不支持GUI,则可以创建不包含GUI模块的运行时,从而大大减小了运行时的大小。
更高的平台完整性-在Java 9之前,可以在平台中使用许多本应用程序的类不打算使用的类。通过强大的封装,这些内部API可以真正被封装,并使用该平台对应用隐藏。如果您的代码依赖内部API,则这可能会使将遗留代码迁移到模块化Java 9成为问题。
改进的性能-JVM使用各种优化技术来提高应用程序性能。 JSR 376表示,如果事先知道所需类型仅位于特定模块中,则这些技术会更有效。
4.如何定义一个模块
具体见<五五面试网-带你 理解 java 模块系统(二)>