Java 9模块化系统JPMS与module-info.java详解
请详细解释Java 9引入的模块化系统(Project Jigsaw/JPMS)。什么是module-info.java?如何定义模块的导出(exports)、依赖(requires)、开放(opens)和服务(provides/uses)?模块化解决了什么问题?
回答
苦行僧
JPMS (Java Platform Module System) 是Java 9的重要特性,通过module-info.java文件定义模块。
module-info.java示例:
module com.example.myapp {
requires java.sql; // 依赖模块
requires transitive java.logging; // 传递依赖
exports com.example.myapp.api; // 导出包给其他模块
exports com.example.myapp.spi to // 限定导出
com.example.plugin;
opens com.example.myapp.internal; // 开放包给反射(如Spring/Jackson)
provides com.example.spi.Service // 提供服务实现
with com.example.myapp.MyService;
uses com.example.spi.Plugin; // 消费服务
}
解决了什么问题:
- 强封装:JDK内部API(如com.sun.*)不再默认可访问,提升安全性
- 可靠配置:模块显式声明依赖,启动时检查缺失/版本冲突
- 可伸缩:JRE可裁剪(jlink生成自定义运行时,仅包含所需模块)
- 性能:类加载路径更短,部分优化(如提前解析)
注意事项:
- module-info.java放在源代码根目录
- 未命名模块(classpath上的jar)可以访问所有模块的导出包
- 迁移时通过--add-exports/--add-opens兼容旧代码
- Maven/Gradle有对应插件支持模块化构建