Java中不存在官方“Apache模块化架构”;Apache项目各自采用JPMS或OSGi等不同模块化方案,二者不兼容,需按场景选型:普通应用用Maven,中间件平台用Karaf/OSGi,新基础库可谨慎尝试JPMS。
java 中并不存在官方的 “apache 模块化架构” 这一标准概念。apache 软件基金会(asf)旗下多个 java 项目(如 apache commons、apache httpclient、apache camel、apache felix、apache karaf 等)各自支持模块化,但它们遵循的是不同层级和机制的模块化方案,并非一个统一叫“apache 模块化架构”的体系。
Java 原生模块化(JPMS)与 Apache 项目的兼容关系
Java 9 引入的 Java 平台模块系统(JPMS) 是 JDK 内置的模块化标准。但绝大多数 Apache 项目(尤其是较早发布的库)并未声明 module-info.java,因此以“自动模块(Automatic Module)”形式运行在模块路径上——即 JAR 文件名成为模块名,所有包默认导出,无强封装性。
- Apache Commons Lang、Collections 等工具库:不提供 module-info,仅作为传统 JAR 使用;若强制置于
--module-path,会转为自动模块,可被命名模块 require,但无法控制包可见性。 - Apache Felix / Karaf:基于 OSGi 规范,使用自己的模块描述(
Bundle-SymbolicName、Export-Package等),与 JPMS 无关;需通过 OSGi 容器加载,不能直接用java -m启动。 - 少数新项目(如 Apache Log4j 2.19+)已添加
module-info.java,支持原生模块化,可显式声明依赖与导出。
OSGi 风格模块化(Apache Felix/Karaf 的典型实践)
Apache Felix 和 Karaf 是 Apache 社区对 OSGi R6/R7 规范 的成熟实现,提供真正的动态模块(Bundle)生命周期管理、服务注册发现、细粒度包导入导出控制。
- 每个 Bundle 是一个带 MANIFEST.MF 描述的 JAR,关键头包括:
Bundle-SymbolicName: org.apache.commons.lang3Export-Package: org.apache.commons.lang3;version="3.12.0"Import-Package: org.slf4j;version="[2.0,3)" - 部署方式:将 Bundle JAR 放入 Karaf 的
deploy/目录,或执行bundle:install命令;容器自动解析依赖并启动。 - 注意:OSGi 模块化与 JPMS 不兼容——二者包可见性模型、类加载机制、服务发现方式完全不同;混合使用需桥接层(如
osgi-to-jpms工具极少见,不推荐生产混用)。
构建与配置示例(以 Maven + Karaf 为例)
要让自定义代码成为 Karaf 可加载的 OSGi Bundle,需在 pom.xml 中启用 maven-bundle-plugin:
- 添加插件配置,指定 Export/Import 包规则,生成合规 MANIFEST.MF;
- 打包类型设为
bundle(非jar); - Karaf 启动后,执行
feature:install xxx或直接bundle:install file:/path/to/your-bundle.jar; - 用
bundle:list查看状态,bundle:services查看已注册服务。
何时该选哪种模块化?
普通 Spring Boot 应用、微服务、工具类库开发 —— 无需主动模块化,用 Maven 管理依赖即可;
需要热部署、插件化扩展、多租户隔离、细粒度服务治理的中间件平台(如集成总线、IoT 网关)—— 选用 Apache Karaf + OSGi Bundle 方案;
JDK 11+ 新建基础库且明确需强封装、版本约束、启动时模块验证 —— 可考虑 JPMS,但须评估生态兼容性(如 Spring、Hibernate 尚未全面模块化)。










