Java
的模块化是指在 Java 9
引入的 模块系统(Java Platform Module System, JPMS),这是 Java
平台自发布以来最重大的结构性变革之一。它的核心目标是让 Java
应用可以更好地进行组织、封装和依赖管理。
一、模块化的动机
在 Java 9
之前,Java
程序使用的是包(package
)来组织类,但包之间的依赖和访问控制是很松散的。常见问题有:
- 无法限制包之间的访问(即使是内部实现也可能被外部代码访问)。
- 难以追踪依赖(比如
JAR
冲突、类路径地狱)。 - 标准库越来越庞大,难以裁剪、维护。
Java
模块化系统旨在解决这些问题。
二、模块基本概念
1. 模块(Module)
模块是一组相关的 包 的集合,打包成一个单元。每个模块都有一个 module-info.java
文件来声明:
- 当前模块的名称
- 该模块依赖的其他模块
- 该模块对外暴露的包
2. module-info.java
文件示例
java
module com.example.myapp {
requires java.sql; // 依赖于 java.sql 模块
exports com.example.myapp.api; // 暴露 API 包
}
三、关键关键字
关键字 | 含义 |
---|---|
module | 声明模块 |
requires | 指定依赖的模块 |
exports | 将模块中的某个包暴露出去,供其他模块使用 |
opens | 允许反射访问指定包(通常用于框架如 Spring) |
provides ... with ... | 模块服务提供者机制(SPI) |
uses | 模块服务使用者机制(SPI) |
四、模块路径 vs 类路径
类路径(Classpath) | 模块路径(Module Path) |
---|---|
没有真正的模块概念 | 有明确模块划分与依赖关系 |
所有类共享命名空间 | 每个模块独立命名空间 |
容易产生冲突 | 冲突更容易被编译器发现 |
无访问控制 | 模块之间默认不能访问私有包 |
五、标准模块化 JDK
JDK 本身也被模块化成了很多模块,例如:
java.base
:最基本的模块,所有模块都隐式依赖它(包含 java.lang, java.util 等)java.sql
:JDBC 模块java.xml
:XML 处理模块
可以通过命令查看 JDK 的模块:
sh
java --list-modules
六、模块化对开发的影响
优点:
- 更清晰的依赖管理
- 更强的封装(内部包不可访问)
- 更小的运行体积(可以裁剪模块)
- 更好的支持大型项目结构
缺点:
- 学习成本增加
- 兼容旧的第三方库可能有问题(不支持模块化的库)
- Spring 等反射框架需要
opens
支持
七、常用命令
bash
# 编译模块
javac -d out --module-source-path src $(find src -name "*.java")
# 运行模块
java --module-path out -m com.example.myapp/com.example.myapp.Main