module-info.java是java 9+模块的必需声明文件,必须置于源码根目录(如src/main/java/),以module 模块名 { ... }格式定义,通过requires声明依赖、exports控制包可见性,缺一不可。

Java 9 模块化系统以 module-info.java 为核心,它不是可选配置,而是模块的“身份证”——没有它,JVM 就不认为这是一个命名模块。
module-info.java 的位置和结构要求
这个文件必须放在模块源码根目录下,与最外层包目录平级。例如,模块名为 com.example.greeting,且包路径是 com/example/greeting/Hello.java,那么 module-info.java 必须直接放在 src/main/java/ 下(Maven 结构),而不是放进 src/main/java/com/example/greeting/ 里。
- 错误位置:
src/main/java/com/example/greeting/module-info.java - 正确位置:
src/main/java/module-info.java(同时该目录下还有com/文件夹) - 内容必须以
module 模块名 { ... }开头,模块名需符合 Java 标识符规范,通常用反向域名风格
基础声明:requires 和 exports
requires 显式声明依赖,exports 控制包可见性——二者缺一不可才能让模块被其他模块使用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
requires java.base;几乎总是需要,因为它是所有模块的隐式父模块 -
requires com.fasterxml.jackson.core;引入第三方模块时,确保该 JAR 已模块化(含module-info.class),否则会退化为自动模块 -
exports com.example.greeting.api;仅导出接口包,隐藏com.example.greeting.internal等实现包 - 如只允许特定模块访问某包,可写成
exports com.example.greeting.api to com.example.app;
反射与编译期依赖的特殊处理
普通 exports 不解决运行时反射需求;requires static 也不影响类可见性——它们各自有明确语义边界。
- 需要 JSON 反序列化或 JPA 字段访问?用
opens com.example.greeting.model;或更安全的opens com.example.greeting.model to com.fasterxml.jackson.databind; - 仅在编译时需要注解处理器(如 Lombok、MapStruct)?写
requires static org.mapstruct.processor;,运行时不加载该模块 - 漏写
transitive是常见坑:若 A → B → C,而 B 声明requires transitive C;,A 才能直接使用 C 中的 public 类
构建与运行必须用模块路径
启用模块系统后,-classpath 失效,一切必须走 --module-path(简写 -p)。
- 编译命令示例:
javac -d mods --module-path lib -sourcepath src src/module-info.java src/com/example/greeting/*.java - 运行命令示例:
java -p mods:lib -m com.example.greeting/com.example.greeting.Main - Maven 用户需启用
maven-compiler-plugin3.8+ 并设<release>9</release>,Gradle 则需配置java { toolchain { languageVersion = JavaLanguageVersion.of(11) } }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










