module-info.java是java 9模块系统的强制核心文件,必须置于src/main/java/根目录,声明模块名、exports/opens及requires(含transitive)以精确控制可见性与依赖传递。

Java 9 模块系统(JPMS)的核心是 module-info.java,它不是可选配置,而是模块的“身份证”——没有它,编译器不认你为模块;放错位置,整个模块化逻辑就失效。创建与配置的关键不在写得多,而在位置准、声明清、边界明。
module-info.java 必须放在正确路径
它必须位于源码根目录,即 src/main/java/module-info.java,与任何包文件夹(如 com/、org/)平级。
- 错误示例:
src/main/java/com/example/module-info.java→ 编译器当它是普通类,报error: module not found - IDE(如 IntelliJ)常默认建在子包内,需手动剪切到
src/main/java/下 - Maven 项目中,还需确保
maven-compiler-plugin配置了<release>11</release>或更高版本,否则模块语法被忽略
基础结构与最小可运行声明
一个合法的 module-info.java 至少包含模块名和基本依赖或导出声明:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
module com.example.myapp {
requires java.base;
exports com.example.myapp.api;
}
-
module 模块名 { ... }是固定语法,模块名应符合 Java 标识符规范(建议小写字母+点号) -
requires java.base可省略(JDK 自动隐式添加),但显式写出更清晰 - 若模块只供其他模块使用(无主类),至少要
exports一个包;若只是启动模块,可只写requires
控制可见性:exports 与 opens 分工明确
exports 解决“能不能编译通过”,opens 解决“能不能反射访问”,二者不可互换。
-
exports com.example.myapp.service;→ 其他模块能 import 并调用该包下的 public 类 -
exports com.example.myapp.service to com.example.client;→ 仅指定模块可访问,增强封装 -
opens com.example.myapp.model;→ 允许任意模块通过反射读写该包内类的私有字段(如 Jackson 反序列化) -
opens com.example.myapp.model to com.fasterxml.jackson.databind;→ 仅 Jackson 模块可反射,更安全
处理依赖传递性:transitive 是关键补丁
当你的模块 A 依赖模块 B,而 B 又用了 java.sql,A 想直接用 Connection?必须让 B 声明 requires transitive java.sql。
- 漏写
transitive→ A 编译报错:package java.sql is not visible -
requires static仅用于编译期工具(如注解处理器),不影响运行时类可见性 - JDK 自带模块(如
java.desktop)不能加transitive,语法报错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










