jdeps 分析依赖并生成 module-info.java 的核心是识别项目实际使用的模块和包以补全 requires 和 exports,需确保所有 JAR 在统一目录、JDK≥9,用 --ignore-missing-deps 生成基础文件,再通过 --jdk-internals、--multi-release 等选项校验隐式依赖,最后人工完善 opens 和 requires 并验证。

用 jdeps 分析依赖并生成 module-info.java,核心在于让工具识别出你项目真正用到的模块和包,再据此补全 requires 和 exports 声明。它不能全自动适配所有场景,但能大幅减少手动推导的工作量。
准备依赖环境与输入目标
确保所有待分析的 JAR(包括你的主应用 JAR 和第三方库)放在统一目录下,比如 libs/。jdeps 需要能“看到”全部字节码才能准确建模依赖链。
- 如果你用 Maven,可先执行
mvn dependency:copy-dependencies -DoutputDirectory=libs - Gradle 用户可用
copy { from configurations.runtimeClasspath into 'libs' } - 确认 JDK 版本 ≥ 9(推荐使用 JDK 17 或 21),运行
jdeps --version验证
运行 jdeps 生成基础 module-info
在项目根目录或 libs 同级路径下执行:
jdeps --ignore-missing-deps --generate-module-info libs/ libs/myapp.jar
该命令会在 libs/ 下生成一个 module-info.java,内容类似:
module myapp {<br> requires java.base;<br> requires com.fasterxml.jackson.databind;<br> exports myapp.api;<br>}
-
--ignore-missing-deps跳过无法定位的依赖(如未提供的内部 SDK),避免中断 - 生成的
exports是基于实际被外部引用的包自动推断的,不一定完整,需人工核对 - 若提示 “no module descriptor found”,说明输入 JAR 不含模块信息,jdeps 会将其视为自动模块处理
细化分析并校验隐式依赖
基础生成只是起点。真实项目常存在 JDK 内部 API 调用、反射访问、服务加载等隐式依赖,需额外检查:
- 加
--jdk-internals查看是否用了 sun.* 或 jdk.internal.* 类 - 加
--multi-release 17(按你目标版本调整)支持多版本 JAR 分析 - 用
jdeps -s --module-path libs/ myapp.jar输出模块级摘要,快速定位缺失的requires - 对需要反射的包(如 JSON 序列化模型类),要在
module-info.java中补充opens myapp.model;或opens myapp.model to com.fasterxml.jackson.databind;
整合进构建流程并验证
生成的 module-info.java 要放入源码正确位置(如 src/main/java/module-info.java),再重新编译。
- 编译失败常见原因:某
requires模块名拼写错误,或对应 JAR 未放在--module-path上 - 运行时抛
NoClassDefFoundError,大概率是遗漏了某个传递依赖模块,可再跑一次jdeps -v myapp.jar查具体类来源 - 配合
jlink构建最小运行时前,务必用jdeps --check myapp.jar确保所有依赖可解析











