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提供了官方标准,微服务则改变了模块化的粒度。开发者应根据项目规模、团队能力和部署环境选择合适的模块化策略。

目录
相关文章
|
1月前
|
运维 数据库 数据安全/隐私保护
【微服务】微服务 vs 单体架构 区别、服务拆分原则、DDD领域驱动设计
本文构建“架构对比→拆分准则→DDD方法论→落地实践→避坑指南”闭环体系,系统剖析单体与微服务的本质差异、演进路径及反模式;详解微服务拆分八大原则与六大禁忌;深度整合DDD战略设计(限界上下文即服务边界)与战术设计(四层架构+聚合建模),提供从0到1的渐进式落地路径与各阶段最佳实践。
|
领域建模
架构设计 DDD领域建模 核心概念
【1月更文挑战第6天】架构设计 DDD领域建模 核心概念
|
Java 持续交付
SpringBoot项目打包分离lib,配置和资源文件部署总结
前言 半自动化部署     (1)当前目录的config目录下     (2)当前目录     (3)classpath的config目录下     (4)classpath的根目录 全自动化部署
1817 0
|
网络协议 ice
STUN, TURN, ICE介绍
STUN STUN协议为终端提供一种方式能够获知自己经过NAT映射后的地址,从而替代位于应用层中的私网地址,达到NAT穿透的目的。STUN协议是典型的Client-Server协议,各种具体应用通过嵌入STUN客户端与STUN Server端通讯来完成交互。
15969 1
winrar_x64_5.31.0.0安装步骤详解(附压缩与解压教程)
WinRAR 5.31 64位官方安装包,支持RAR、ZIP、7Z等格式的压缩与解压,操作简洁,兼容Win10/Win11。含中文向导、文件关联及桌面快捷方式设置,适合日常文件管理与备份。(239字)
|
5月前
|
Java 数据库 微服务
微服务服务注册与发现
本文介绍了微服务架构的演进与实践。针对单体架构在团队协作、发布效率、扩展性等方面的局限,微服务通过将系统拆分为多个独立部署、单一职责的小型服务,实现高内聚、低耦合,提升系统的可维护性与伸缩能力。结合Spring Cloud与Spring Cloud Alibaba技术栈,文章以黑马商城项目为例,演示了如何创建微服务工程、进行服务拆分,并使用RestTemplate实现服务间远程调用,帮助开发者掌握微服务核心开发技能。
微服务服务注册与发现
|
8月前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
778 0
|
Java Maven 开发工具
知识分享之Java——Maven的settings常用配置文件
日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家,让其还在深坑中的小伙伴有绳索能爬出来。 同时在这里也欢迎大家把自己遇到的问题留言或私信给我,我看看其能否给大家解决。
735 0
知识分享之Java——Maven的settings常用配置文件
|
缓存 负载均衡 前端开发
Nginx详细配置指南
Nginx详细配置指南
674 0
|
Oracle Java 关系型数据库
JLink 使用教程:从入门到精通
本文提供了JLink工具的使用教程,包括入门、进阶和高级篇,涉及创建运行时镜像、添加模块、自定义启动器、压缩镜像、自定义运行时参数和配置文件等内容,旨在帮助用户创建独立的Java应用程序运行时环境。
2287 0

热门文章

最新文章