Java的模块化长征——从OSGi到JPMS的十年恩怨

简介: Java模块化是一场持续了十多年的运动,经历了从第三方OSGi标准到官方JPMS(Java平台模块系统)的漫长演进。

Java模块化是一场持续了十多年的运动,经历了从第三方OSGi标准到官方JPMS(Java平台模块系统)的漫长演进。JDK 9引入的模块化系统不仅是Java语言最大的结构性变化之一,也是JDK自身重构的基础——它将庞大的rt.jar拆分为多个模块,允许应用只包含所需的部分,从而减少内存占用和启动时间。

OSGi是Java模块化的先驱。早在2000年,OSGi联盟就定义了基于Bundle的模块化规范。OSGi Bundle是包含元数据(MANIFEST.MF)的JAR文件,声明了导出的包、导入的包、以及可选的Require-Bundle。OSGi运行在特殊的框架中(如Equinox、Felix),支持模块的动态安装、启动、停止和更新,而无需重启JVM。
参考:https://ltglu.cn/category/sleep-psychology.html

OSGi的强大之处在于其类加载器架构。每个Bundle拥有独立的类加载器,模块之间的类隔离通过不同的类加载器实现。Bundle可以导出特定包,其他Bundle只能访问被导出的包。这种严格的隔离使得同一个JVM中可以运行不同版本的同一库,这在应用服务器和IDE(如Eclipse)中非常有用。

然而,OSGi也有显著的缺点:类加载器架构复杂,调试困难;需要特殊的容器,不能在普通JVM中运行;元数据配置繁琐;动态更新在实际生产中使用较少。这些问题促使Java官方开发自己的模块化系统。

JPMS(Java Platform Module System,又称Project Jigsaw)在JDK 9中正式发布。JPMS的核心是模块描述符(module-info.java),编译后成为module-info.class。模块描述符声明:模块名称、导出的包、依赖的模块、提供的服务等。例如,module com.example.foo { exports com.example.foo.api; requires java.sql; }。
参考:https://ltglu.cn/category/sleep-environment.html

JPMS的类加载器架构比OSGi简单。JDK本身被划分为多个模块(java.base是所有模块的基础),应用模块在启动时被解析,形成一个有向无环图。类加载器仍然存在(Bootstrap、Extension、Application、自定义),但模块系统增强了类加载器的隔离能力。

模块路径是JPMS引入的新概念。传统的类路径(Classpath)是一个扁平的JAR列表,JVM在其中按顺序搜索类。模块路径上的模块支持模块化特性:强封装、可靠配置、以及服务绑定。模块路径上的JAR也可以作为自动模块(放在模块路径但没有module-info的JAR),自动模块名称从JAR文件名推断,并导出所有包。

强封装是JPMS最重要的安全特性。在模块系统中,一个模块只导出明确声明的包,未导出的包即使声明为public,在模块外部也不可见。这打破了长期以来Java中public意味着完全可见的规则,为平台安全提供了新的保障。JDK内部API(如sun.misc.Unsafe)被封装起来,迫使开发者使用官方支持的API。

可靠配置确保模块依赖在启动时被完整解析。如果模块A依赖模块B,但模块B不在模块路径上,JVM在启动时会报错,而不是等到运行时抛出ClassNotFoundException。这种早期错误检测大大提高了应用的可维护性。

服务绑定提供了一种松耦合的依赖注入机制。模块可以使用provides ... with ...声明服务提供者,使用uses声明服务消费者。模块系统在启动时自动将服务消费者绑定到可用的提供者,无需显式配置。
参考:https://ltglu.cn/category/sleep-products.html

JPMS的迁移挑战是巨大的。首先,现有库需要添加module-info.java才能成为显式模块,但这对成千上万的库来说是不现实的。解决方案是自动模块和未命名模块。自动模块位于模块路径上但没有module-info,它导出所有包,并依赖所有其他模块。未命名模块包含类路径上的所有代码,它可以访问所有模块,但模块不能访问未命名模块(除非使用--add-reads)。这种设计允许逐步迁移:先将应用部署到模块路径上,将类路径上的库作为自动模块,然后逐步为库添加模块描述符。

JDK自身的模块化是JPMS的最大成功。JDK 9将rt.jar(约60MB)拆分为大约100个模块。这意味着应用可以只包含所需的模块,使用jlink工具创建自定义的JRE镜像。对于微服务、容器化应用和嵌入式系统,这可以显著减少内存占用和镜像大小。

多版本JAR是JPMS的辅助特性,允许在同一个JAR中包含针对不同Java版本的类。这在模块化迁移中很有用——你可以为Java 9+提供module-info.class,同时保持对Java 8的兼容性。

模块化与IDE的集成是JPMS普及的关键。IntelliJ IDEA、Eclipse、NetBeans都支持创建和管理模块化项目,包括module-info.java的编写、模块路径的配置、以及模块图的可视化。构建工具Maven和Gradle也支持模块路径,但配置略有不同。

JPMS并非没有批评者。有人认为JPMS过于复杂,增加了学习成本;有人认为它的服务绑定不如Spring或Guice强大;还有人认为模块化带来的好处不足以抵消迁移成本。这些批评有一定道理,但JPMS的主要价值在于JDK自身的模块化和对大型应用的结构化支持,而不是作为通用的依赖注入框架。
参考:https://ltglu.cn
在实践中,是否使用JPMS取决于项目规模。对于小型应用,类路径和传统JAR已经足够。对于大型、长期维护的企业应用,模块化可以显著改善架构的可维护性。对于构建自定义JRE镜像的容器应用,JPMS几乎是必需的。

目录
相关文章
|
1月前
|
人工智能 API 开发者
阿里云百炼Coding Plan售罄、抢不到怎么办?最新解决攻略及替代方案
阿里云百炼Coding Plan因Lite版停售、Pro版每日限量抢购(9:30开售),致“一码难求”。本文解析售罄原因,提供抢购技巧(账号/支付/刷新时机等),并推荐零门槛替代方案:开通百炼按量付费服务,享100万免费Tokens、同款满血模型,即开即用。
673 3
|
Oracle Java 关系型数据库
Linux环境安装配置JDK11
Linux环境安装配置JDK11
2074 0
|
消息中间件 自然语言处理 容灾
实时或者准实时的说法
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。本文从个人理解出发,探探实时或者准实时搜索。
2598 0
|
10天前
|
存储 Linux iOS开发
【2026最新】MarkText中文版Markdown编辑器使用图解(附安装包)
MarkText是一款免费开源、跨平台的Markdown编辑器,主打所见即所得实时预览,支持Windows/macOS/Linux。内置数学公式、流程图、代码高亮、多主题及PDF/HTML导出,是Typora的轻量免费替代首选。(239字)
|
1月前
|
数据采集 JSON API
亚马逊数据采集 API 架构设计:同步 vs 异步的规模化实践
跨境电商数据平台面临同步采集吞吐瓶颈:1万ASIN同步需14小时,而异步架构通过任务解耦+并行处理,压缩至30~60分钟。响应延迟从5秒降至200ms,吞吐量可弹性扩展,积点成本不变,仅需增加轻量回调服务。适合日均百单以上规模化场景。(239字)
111 3
|
1月前
|
存储 弹性计算 人工智能
阿里云服务器2核2G最低价格,云服务器99元,轻量应用服务器38元,区别与选择指南
对于预算有限且对性能要求不高的用户,阿里云推出的2核2G配置服务器成为首选,其中轻量应用服务器以38元/年(新用户抢购价)和云服务器ECS经济型e实例以99元/年(新老用户同享)的两款特价方案,分别满足“极致入门”与“稳定普惠”的需求。前者以200M峰值带宽、预置镜像和快速部署见长,适合个人博客、开发测试及AI应用体验;后者以3M固定带宽、长效同价续费及完整ECS功能为优势,更适合企业官网、轻量数据库等长期稳定场景。
423 2
|
1月前
|
人工智能 自然语言处理 安全
2026 最新版 OpenClaw,Windows 一键汉化,无扰随行(包含新安装包)
2026 最新版 OpenClaw 中文一键安装包,以清冷简约为基调,剔除所有冗余捆绑与弹窗干扰,全程无代码、免命令、免手动配置。内置轻量化中文汉化补丁与适配运行环境,自动匹配 Windows 主流系统,双击启动后,简洁引导、快速部署,安装后界面干净清爽、运行流畅无卡顿,无需额外调试,适配偏爱安静、简约使用场景的用户,轻松实现无扰使用。
|
2月前
|
存储 监控 安全
Java ZGC:亚毫秒级停顿的低延迟GC 革命性底层设计
ZGC是Java里程碑式低延迟GC:通过有色指针与读屏障,实现亚毫秒级STW停顿(<1ms),且停顿时间不随堆大小(8MB–16TB)或存活对象增长。JDK21起为默认GC,兼顾高吞吐(损耗≤15%),彻底解决传统GC停顿劣化难题。
505 6
|
3月前
|
人工智能 运维 数据可视化
2026年阿里云无影AgentBay 部署OpenClaw(Clawdbot)保姆级详细教程
2026年,AI Agent 进入规模化落地阶段,OpenClaw(前身为Clawdbot、Moltbot)作为轻量级开源AI代理框架,凭借“自然语言驱动、多工具协同、零编程门槛”的核心优势,成为个人与企业解锁云端自动化办公的首选工具。它无需复杂操作,仅需输入口语化指令,就能自动完成文档整理、网页抓取、日程规划、跨平台数据同步等重复性工作,而阿里云无影AgentBay的推出,彻底解决了OpenClaw传统部署中“环境配置复杂、资源弹性不足、运维成本高”的痛点。
630 5
|
8月前
|
安全 JavaScript 前端开发
Wappalyzer-网站技术栈识别
Wappalyzer 是一款网站技术指纹识别工具,可识别网站使用的 Web 服务器、前端框架、CMS、电商平台、编程语言、数据库、安全防护及统计工具等技术栈,常用于渗透测试中的信息收集。支持命令行和浏览器插件使用,可单个或批量检测目标网站,输出详细技术信息,便于安全分析与漏洞挖掘。
1140 1
Wappalyzer-网站技术栈识别

热门文章

最新文章