Java平台模块系统

Java平台模块系统(Java Platform Module System,简称JPMS[1]指定了Java代码和相关资源的集合的分发格式。它还指定了一个用于存储这些集合,或者说模块的存储库,并确定如何发现、加载它们,以及检查它们的完整性。它包含了命名空间等功能,旨在修复已有JAR格式中的一些缺点,尤其是JAR地狱,这可能导致类路径和类加载等问题。

Java模块系统最初是在JCP下开发的,称为JSR 277,并计划与Java 7一起发布。

后来,JSR 277被搁置,并创建了Jigsaw项目[2]来将JDK模块化。该JSR已被JSR 376(Java平台模块系统)取代。

Jigsaw项目最初打算用于Java 7(2011年),但被推迟到Java 8(2014年),作为备用计划的一部分,[3]后再次被推迟到2017年的Java 9版本。[4]包含了Java模块系统的Java 9于2017年9月21日发布。[5]

架构

Java 9中实现的Java模块系统包括以下JEP英语JDK Enhancement ProposalJSR(Java规范请求)[2]

  • JEP 200:模块化JDK:定义JDK的模块化结构
  • JEP 201:模块化源代码:将JDK源码按模块化重新组织,增强构建系统来编译模块,并在构建时强制执行模块边界
  • JEP 220:模块化运行时映像:重构JDK和JRE运行时映像,以适应模块并提高性能、安全性和可维护性
  • JEP 261:模块系统:实现Java平台模块系统
  • JEP 282:Java链接器:创建工具以将一组模块及其依赖项组装和优化为自定义运行时映像[6]
  • JSR 376:Java平台模块系统[1]

此外,JDK 9还添加了其它几项功能,来轻松过渡到模块系统:

  • JEP 238:多版本JAR文件:扩展JAR文件格式,以便多个特定于Java版本的类文件版本可以共存于单个存档中。[7]
  • JEP 253:为模块化准备JavaFX UI控件和CSS API:为JavaFX功能定义公共API,这些功能目前只能通过内部API获得,并将因模块化而变得无法访问。[8]
  • JEP 260:封装大多数内部API:使大多数JDK的内部API默认不可访问,但保留一些关键的、广泛使用的内部API可以访问,直到其全部或大部分功能存在受支持的替代品为止。[9]
  • JEP 275:模块化Java应用程序的打包:Java打包器英语Java packager将针对JDK 9进行改进,以使其能够识别模块,例如可以打包一个模块及其依赖的所有模块。[10]

模块的属性

模块是一种新的代码组织方式。与JAR文件相反,模块显式声明它们依赖哪些模块,以及导出哪些包。[11]显式依赖关系声明可以更轻松地推理大型应用程序与软件组件之间的依赖关系,从而提高代码完整性。

模块声明放在module-info.java文件中,该文件位于模块源文件层次结构的根目录。在编译时和运行时,JDK都会验证模块之间的依赖关系以及交互。

例如,以下就是一个模块声明。它声明模块com.foo.bar依赖于另一个模块com.foo.baz,并导出com.foo.bar.alpha和com.foo.bar.beta两个包。

module com.foo.bar {
    requires com.foo.baz;
    exports com.foo.bar.alpha;
    exports com.foo.bar.beta;
}

com.foo.bar.alpha和com.foo.bar.beta两个包中的公有成员将可由依赖模块访问。而私有成员则无法访问,即使通过反射等手段也不行。请注意,在Java 9到Java 16中,是否允许这种“非法访问”,事实上取决于命令行设置。[12]

JDK自身在Java 9中已经被模块化。[13]

与OSGi的链接

Java模块系统并不打算支持OSGi平台当前支持的所有功能(例如生命周期模型和服务注册表)。但Java模块系统也支持某些OSGi不支持的功能,例如编译时的模块化,以及内置支持native库。[14]2016年有几篇探讨Java模块系统和OSGi如何互操作的文章,可以在InfoQ[15],以及OSGi联盟博客[16]上找到。

参见

参考资料

  1. ^ 1.0 1.1 Java Platform Module System (JSR 376) [Java平台模块系统(JSR 376)]. 甲骨文公司. [2018-07-02]. (原始内容存档于2022-06-05) (英语). 
  2. ^ 2.0 2.1 Project Jigsaw [Jigsaw项目]. 甲骨文公司. [2015-11-29]. (原始内容存档于2021-01-09) (英语). 
  3. ^ Mark Reinhold. It's time for … Plan B [是时候……实施B计划了]. 甲骨文公司. 2009-09-20 [2017-06-21]. (原始内容存档于2011-07-11) (英语). 
  4. ^ JDK 9. 甲骨文公司. [2016-02-24]. (原始内容存档于2022-06-06) (英语). 
  5. ^ Java 9: Release date and new features [Java 9:发布日期和新功能]. techworld.com. 2017-07-21 [2017-11-18]. (原始内容存档于2017-12-07) (英语). 
  6. ^ jlink: The Java Linker (JSR 282) [jlink:Java链接器(JSR 282)]. 甲骨文公司. [2016-03-12]. (原始内容存档于2017-11-03) (英语). 
  7. ^ JEP 238: Multi-Release JAR Files [JEP 238:多版本JAR文件]. 甲骨文公司. [2017-07-31]. (原始内容存档于2022-04-06) (英语). 
  8. ^ JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization [JEP 253:为模块化准备JavaFX UI控件和CSS API]. 甲骨文公司. [2017-07-31]. (原始内容存档于2022-05-21) (英语). 
  9. ^ JEP 260: Encapsulate Most Internal APIs [JEP 260:封装大多数内部API]. 甲骨文公司. [2017-07-31]. (原始内容存档于2022-06-05) (英语). 
  10. ^ JEP 275: Modular Java Application Packaging [JEP 275:模块化Java应用程序的打包]. 甲骨文公司. [2017-07-31]. (原始内容存档于2022-05-15) (英语). 
  11. ^ Mark Reinhold. The State of the Module System [模块系统的状态]. 甲骨文公司. 2016-03-08 [2017-02-18]. (原始内容存档于2022-01-26) (英语). 
  12. ^ JEP 396: Strongly Encapsulate JDK Internals by Default [JEP 396:JDK内部默认强封装]. [2021-02-06]. (原始内容存档于2022-04-25) (英语). 
  13. ^ JDK Module Summary [JDK模块总结]. 甲骨文公司. 2016-06-24 [2017-02-18]. (原始内容存档于2015-12-08) (英语). 
  14. ^ Mark Reinhold. Project Jigsaw: Late for the train: The Q&A [Jigsaw项目:迟到的问答]. 甲骨文公司. 2012-08-24 [2015-11-29]. (原始内容存档于2023-11-01) (英语). 
  15. ^ Java 9, OSGi and the Future of Modularity [Java 9、OSGi与模块化的未来]. InfoQ. [2016-09-26]. (原始内容存档于2024-05-15) (英语). 
  16. ^ Java Module Layers and OSGi Bundles [Java 模块层与OSGi Bundles]. OSGi Alliance. [2016-08-01]. (原始内容存档于2023-12-07) (英语). 

外部链接