Java的模块化演进:从OSGi到JPMS再到微服务

简介: Java的模块化经历了漫长的演进,从早期的无模块化、到第三方OSGi规范,再到Java 9官方引入的JPMS(Java Platform Module System),以及当前微服务架构下的新思考

Java的模块化经历了漫长的演进,从早期的无模块化、到第三方OSGi规范,再到Java 9官方引入的JPMS(Java Platform Module System),以及当前微服务架构下的新思考。这一历程反映了软件工程对封装性、可维护性和部署独立性的追求。

在Java 9之前,Java平台本身是一个巨大的rt.jar(约60MB),包含所有标准库类。开发者使用类路径(classpath)管理依赖,这种方式存在明显缺陷:没有模块边界,所有公有类都相互可见;可能发生类冲突或版本冲突;无法表示内部API。企业级应用通过包命名约定(如com.mycompany)来避免冲突,但无法强制封装。

OSGi(Open Services Gateway initiative)在2000年代初期出现,成为Java模块化的事实标准。OSGi定义了一个动态模块系统,每个模块(bundle)是一个JAR文件,包含元数据(MANIFEST.MF)声明导出的包、依赖的包和版本范围。OSGi运行在专门的框架(如Eclipse Equinox、Apache Felix)中,支持运行时安装、启动、停止、更新模块。OSGi的优势是强大的模块隔离和动态性,被Eclipse IDE、Adobe Experience Manager等大型应用采用。但OSGi的学习曲线陡峭,类加载器模型复杂,与主流开发工具和库(如Spring Boot)集成不便。

Java 9正式引入了JPMS,旨在提供轻量级的、语言级的模块化。每个模块包含module-info.java文件,声明模块名称、依赖(requires)、导出包(exports)、服务(provides/uses)等。JPMS的模块路径取代了类路径,模块间的可见性由声明决定。JDK本身也被模块化,rt.jar拆分为java.base、java.sql、java.xml等多个模块,开发者可以使用jlink创建只包含必要模块的定制运行时镜像,体积大幅缩减。JPMS还增强了封装性:未导出的包即使在反射下也不可见(除非使用--add-opens)。

然而,JPMS在社区中的采用并不如预期迅速。主要障碍包括:现有库的模块化迁移成本高(需要为每个JAR编写module-info);双向依赖和循环依赖问题;以及Maven/Gradle等构建工具的支持滞后。许多开源项目(如Spring Framework 6)开始支持模块化,但普通应用开发者仍较少直接使用module-info,而是继续使用类路径,或者仅使用JPMS的部分特性(如jlink)。

与此同时,微服务架构的兴起为模块化提供了另一种视角。微服务将系统拆分为独立的进程,每个服务有自己的部署单元(如容器镜像),服务间通过网络API通信。这种“进程级模块化”从根本上避免了类加载器冲突、版本管理等问题,代价是增加了分布式系统复杂性。与JPMS或OSGi相比,微服务的模块边界更硬,但通信开销更大。在单体应用内部,JPMS仍然有助于改善代码结构和可维护性。

JPMS的未来在于与工具链的深度集成。Maven和Gradle已经支持多模块项目与JPMS协同,IntelliJ IDEA和Eclipse提供了module-info的编写辅助。Java 17之后的版本继续完善JPMS,例如增加了对密封类的支持。此外,GraalVM native image对JPMS也有一定支持,可以编译模块化为独立可执行文件https://190086.com。

对于新项目,建议从设计上考虑模块化,但不一定急于引入module-info。可以先采用包级别封装(包私有类),并使用构建工具的多模块项目进行物理隔离。当项目规模变大,需要严格控制依赖关系时,再添加module-info。对于库开发者,提供模块化的JAR(包含module-info)可以提高兼容性。

总之,Java模块化的演进反映了从技术实现到架构思想的变迁。OSGi为模块化积累了经验,JPMS提供了官方标准,微服务则改变了模块化的粒度。开发者应根据项目规模、团队能力和部署环境选择合适的模块化策略。

目录
相关文章
|
6月前
|
IDE 安全 Java
Java的模块化长征——从OSGi到JPMS的十年恩怨
Java模块化是一场持续了十多年的运动,经历了从第三方OSGi标准到官方JPMS(Java平台模块系统)的漫长演进。
296 1
|
领域建模
架构设计 DDD领域建模 核心概念
【1月更文挑战第6天】架构设计 DDD领域建模 核心概念
|
SQL XML 安全
mybatis批量更新数据三种方法效率对比【Mysql】
mybatis批量更新数据三种方法效率对比【Mysql】
6038 0
mybatis批量更新数据三种方法效率对比【Mysql】
|
Java 持续交付
SpringBoot项目打包分离lib,配置和资源文件部署总结
前言 半自动化部署     (1)当前目录的config目录下     (2)当前目录     (3)classpath的config目录下     (4)classpath的根目录 全自动化部署
2007 0
|
网络协议 ice
STUN, TURN, ICE介绍
STUN STUN协议为终端提供一种方式能够获知自己经过NAT映射后的地址,从而替代位于应用层中的私网地址,达到NAT穿透的目的。STUN协议是典型的Client-Server协议,各种具体应用通过嵌入STUN客户端与STUN Server端通讯来完成交互。
16518 1
|
4月前
|
数据采集 人工智能 缓存
字节面试官:别再直接让 AI 写代码了,先学会 SDD 规格驱动开发
AI编程虽快,但需求模糊易致代码失控。SDD(规格驱动开发)主张先明确定义目标、边界、行为、约束与验收标准,再让AI编码。对测试开发尤为关键——它将模糊需求转化为可测、可验、可追溯的质量规格,推动测试前置、风险可控、回归有据。
|
6月前
|
运维 数据库 数据安全/隐私保护
【微服务】微服务 vs 单体架构 区别、服务拆分原则、DDD领域驱动设计
本文构建“架构对比→拆分准则→DDD方法论→落地实践→避坑指南”闭环体系,系统剖析单体与微服务的本质差异、演进路径及反模式;详解微服务拆分八大原则与六大禁忌;深度整合DDD战略设计(限界上下文即服务边界)与战术设计(四层架构+聚合建模),提供从0到1的渐进式落地路径与各阶段最佳实践。
|
6月前
|
IDE Java 开发工具
【全网最详细】IDEA官网下载 | IntelliJ IDEA安装使用保姆级教程(附社区版安装包)
IntelliJ IDEA是JetBrains开发的主流Java IDE,以智能代码补全、强大重构、深度框架支持(Spring/Maven/Gradle)和丰富插件生态著称,广受开发者青睐。社区版免费,旗舰版功能更全,安装配置简单,显著提升开发效率。(239字)
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
1146 0
|
XML JSON Java
Jackson反序列化不可变类
Jackson 默认的反序列化策略需要无参构造器和字段 setter 函数。对于不可变类(如 `ImmutableUser`),可以通过以下三种方式解决: 1. **使用 Jackson 注解**:在全参构造器上使用 `@JsonCreator` 和 `@JsonProperty` 注解。 2. **使用 jackson-module-parameter-names**:引入依赖并注册 `ParameterNamesModule` 模块。 3. **使用 Mixins 机制**:创建一个 Mixin 类,使用 `@JsonCreator` 和 `@JsonProperty` 注解
386 3
Jackson反序列化不可变类