在 Java 9 引入 Module System(JPMS,Java Platform Module System) 之后,调试“模块(Module)”相关的问题,和传统 Java 调试不太一样。下面从 常见模块问题 → 调试手段 → 实战示例 三个层面来讲。
--show-module-resolution启动 JVM 时加上:
java --show-module-resolution -m com.example/app
可以看到:
✅ 适合排查 module not found
--describe-module查看模块的真实定义:
java --describe-module java.sql
或对你自己的 jar:
java --describe-module -p mylib.jar
可以看到:
-verbose:module打印模块加载过程:
java -verbose:module -m com.example/app
输出示例:
[module, 0.123] root com.example
[module, 0.124] requires java.base
[module, 0.125] requires com.lib
✅ 适合看 模块依赖链
常见错误:
java.lang.reflect.InaccessibleObjectException
排查方式:
--add-opens com.foo/com.foo.internal=ALL-UNNAMED
调试技巧:
--add-opens java.base/java.lang=ALL-UNNAMED
--illegal-access=warn 看警告(Java 9–16)Run → Edit Configurations--module-path target/libs --add-modules com.example
在运行配置中确认:
jdeps 分析模块依赖jdeps --module-path libs -m com.example
或查看 jar 是否需要拆模块:
jdeps --jdk-internals mylib.jar
✅ 适合:
Module m = MyClass.class.getModule();
System.out.println(m.getName());
System.out.println(m.getPackages());
或:
ModuleLayer.boot().modules()
.forEach(m -> System.out.println(m.getName()));
com.x is not visible because package com.x is not exported
✅ 解决:
module com.lib {
exports com.x;
}
调试方式:
java --describe-module com.lib
field.setAccessible(true); // 抛异常
✅ 解决(调试/兼容):
--add-opens com.lib/com.lib.internal=ALL-UNNAMED
ServiceLoader.load(MyService.class); // 空
检查:
provides MyService with MyServiceImpl;
uses MyService;
✅ 模块路径(module-path) ≠ 类路径(classpath)
✅ 报错先看:
requiresexportsopens
✅ 使用 --show-module-resolution 永远第一步如果你愿意,可以:
module-info.java免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。