
书: https://pan.baidu.com/s/1jDVnfhmGRwu5jeEuV63Kcg?pwd=bmyj
笔记如下:
- 模块化核心概念:Java 9引入JPMS(Java Platform Module System),通过
module-info.java
定义模块边界,解决JAR地狱问题。 - 模块声明语法:
module com.example.myapp {
requires java.sql; // 依赖其他模块
exports com.example.api; // 导出包
opens com.example.impl; // 反射开放包
}
- 强封装性:默认禁止跨模块访问未导出包,打破传统类路径(Classpath)的宽松依赖。
- 模块类型:
- 命名模块:显式声明
module-info.java
。 - 未命名模块:传统类路径下的JAR,自动依赖所有模块(兼容旧代码)。
- 自动模块:无
module-info.java
的JAR,转换为模块时过渡使用。
- 模块路径(Modulepath):替代类路径,通过
--module-path
指定模块位置。 - 服务加载机制:
provides...with
声明服务实现,uses
消费服务(强化SPI)。 - JLink工具:生成定制化JRE,仅包含应用所需模块,显著减小运行时体积。
- 拆分JDK模块:原
rt.jar
拆分为java.base
、java.sql
等75个模块,java.base
为默认依赖。 - 反射限制:未
opens
的包禁止反射访问,需通过--add-opens
运行时突破封装(慎用)。 - 兼容性处理:
--add-modules
强制添加模块依赖。--add-reads
增加模块读取权限。
- 模块化迁移策略:
- 自底向上:先封装底层库,逐步向上迁移。
- 使用自动模块过渡混合路径(Modulepath+Classpath)。
- 多模块项目构建:Maven/Gradle支持模块化,子项目需定义
module-info.java
。 - 模块化优势:
- 显式依赖管理,避免冲突。
- 启动更快(仅加载必要模块)。
- 更强的安全性(封装内部API)。
- 常见问题:
- 循环依赖需通过接口模块(
requires transitive
)解耦。 - 第三方库未模块化时需转为自动模块。
- 循环依赖需通过接口模块(
- 工具链支持:
jdeps
分析依赖关系。jmod
创建JMOD格式模块(支持本地代码)。
- 模块化与OSGi对比:JPMS为语言层标准,OSGi侧重运行时动态性。
- 模块化测试:JUnit 5支持模块化测试,需配置
--patch-module
。 - 模块化设计模式:
- 接口模块(
exports...to
限制使用方)。 - 聚合模块(聚合多个子模块)。
- 接口模块(
- 微服务适配:模块化与Spring Boot共存方案(如
spring-context-indexer
优化扫描)。 - 未来演进:Project Jigsaw的后续优化(如动态模块加载、模块版本化)。