CodeWalk

Java 9模块化系统JPMS与module-info.java详解

作者:苦行僧 · 2026-05-30 12:55

请详细解释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;          // 消费服务
}

解决了什么问题

  1. 强封装:JDK内部API(如com.sun.*)不再默认可访问,提升安全性
  2. 可靠配置:模块显式声明依赖,启动时检查缺失/版本冲突
  3. 可伸缩:JRE可裁剪(jlink生成自定义运行时,仅包含所需模块)
  4. 性能:类加载路径更短,部分优化(如提前解析)

注意事项

  • module-info.java放在源代码根目录
  • 未命名模块(classpath上的jar)可以访问所有模块的导出包
  • 迁移时通过--add-exports/--add-opens兼容旧代码
  • Maven/Gradle有对应插件支持模块化构建