java 9+ 多模块项目必须严格遵循模块系统规则:先编译各模块的module-info.java,再通过--module-path指定依赖模块路径,按requires依赖链顺序编译,运行时也须用--module-path而非-cp。

Java 9+ 多模块项目编译不能套用老式 javac -cp 方式,必须严格遵循模块系统规则:先编译 module-info.java,再按模块路径组织依赖,显式声明模块关系。
必须先编译 module-info.java
每个模块根目录下必须有 module-info.java,且它必须最先被编译。否则 javac 会报 module not found 或 package is declared in module, but module is not specified。
- 进入模块源码根目录(如
src/module-a),执行:javac -d mods/module-a module-info.java - 不能跳过这步直接编译其他 .java 文件;也不能把
module-info.java和业务类混在一起写成javac *.java
用 --module-path 替代 -classpath
模块化项目中,-cp(类路径)对模块间依赖无效,所有模块 JAR 或编译输出目录必须通过 --module-path 提供。
- 假设已编译好模块 A 到
mods/module-a,模块 B 依赖 A,则编译 B 时需:javac --module-path mods -d mods/module-b src/module-b/**/*.java -
mods是存放所有模块输出(.class 或 .jar)的父目录;javac 会自动扫描其中的module-info.class来解析依赖 - 若模块 B 的
module-info.java中写了requires module.a;,但mods/module-a不存在或没编译,就会失败
编译顺序要符合 requires 依赖链
模块之间是单向依赖,编译必须从最底层模块开始,逐层向上。
- 例如:C → requires B → requires A,则编译顺序必须是 A → B → C
- 不能先编译 C,即使你把 A、B 都放在
--module-path下——因为 C 的module-info.java还没生成,javac 无法验证requires是否合法 - 建议为每个模块单独建输出目录(如
mods/a、mods/b),避免 class 文件混杂
运行时也要匹配模块路径
编译用 --module-path,运行也得用它,不能回退到 -cp:
- 运行命令示例:
java --module-path mods -m module.c/com.example.Main -
-m module.c/com.example.Main表示以module.c为启动模块,主类在该模块内 - 如果漏掉
--module-path或路径不全,JVM 会提示Module module.b not found,而不是 ClassNotFoundException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











