Skip to content

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