jdeps 是 jdk 9+ 提供的静态依赖分析工具,可生成 requires 列表、建议模块及 module-info.java 骨架,但需人工补充 exports、opens、uses 等声明,并通过 --check 等验证依赖完整性。

jdeps 是 JDK 自带的静态依赖分析工具,从 JDK 9 开始支持模块系统。它不能直接生成完整的 module-info.java,但能快速输出依赖列表和建议的 requires 语句,是手动编写模块描述符的高效起点。
1. 基础命令:扫描 JAR 并生成 requires 列表
对目标 JAR(如 mylib.jar)运行:
更常用的是让 jdeps 推荐所有可能需要的模块:
jdeps --module-path $JAVA_HOME/jmods --suggest-modules mylib.jar该命令会输出类似:
mylib.jar -> java.basemylib.jar -> java.logging
mylib.jar -> java.xml
这就是最简化的 requires 清单,可直接复制进 module-info.java 的 requires 部分。
2. 加上 --multi-release 和 --recursive 提升准确性
若 JAR 含多版本 class(如 META-INF/versions/9/),需加 --multi-release 9;若依赖嵌套 JAR 或目录结构复杂,加 --recursive 确保不漏依赖:
注意:--recursive 会对每个依赖 JAR 再次扫描,结果更全,但输出略长,建议配合 grep " -> " 过滤主依赖行。
3. 生成完整模板:结合 --generate-module-info
JDK 11+ 支持自动生成骨架文件:
jdeps --generate-module-info ./src --module-path $JAVA_HOME/jmods mylib.jar执行后会在 ./src/mylib 目录下生成 module-info.java,内容形如:
requires java.base;
requires java.logging;
// 注意:未自动导出包,也未处理 open、uses、provides 等高级声明
这个文件只是起点,仍需人工检查并补充:
- 用
package命令确认哪些包要exports - 如有反射访问需求,添加
open或opens语句 - 若使用 SPI,补上
uses或provides
4. 验证与调试技巧
生成后别急着编译,先用 jdeps 验证是否遗漏:
jdeps --module-path ./src --check mylib也可用 javac 编译 module-info.java,再运行:
java --module-path . --add-modules ALL-SYSTEM --list-modules | grep mylib确保模块被识别且无“requires transitive”误判 —— jdeps 默认不推断传递性,是否加 transitive 需根据 API 是否暴露依赖类型来判断。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











