温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何调试java Module模块

发布时间:2026-10-30 18:27:55 来源:亿速云 阅读:92 作者:小樊 栏目:编程语言

在 Java 9 引入 Module System(JPMS,Java Platform Module System) 之后,调试“模块(Module)”相关的问题,和传统 Java 调试不太一样。下面从 常见模块问题 → 调试手段 → 实战示例 三个层面来讲。


一、常见需要调试的模块问题

  1. 模块找不到(module not found)
  2. 包不可见(package is not visible / not exported)
  3. 反射访问失败(IllegalAccessError / InaccessibleObjectException)
  4. 模块路径 vs 类路径混乱
  5. 自动模块(automatic module)问题
  6. ServiceLoader 不生效

二、调试 Java Module 的核心手段

1️⃣ 使用 --show-module-resolution

启动 JVM 时加上:

java --show-module-resolution -m com.example/app

可以看到:

  • 模块如何被解析
  • 哪些模块被 root / 被间接引入
  • 为什么某个模块没被加载

✅ 适合排查 module not found


2️⃣ 使用 --describe-module

查看模块的真实定义:

java --describe-module java.sql

或对你自己的 jar:

java --describe-module -p mylib.jar

可以看到:

  • exports
  • requires
  • provides / uses
  • opens

3️⃣ 使用 -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

✅ 适合看 模块依赖链


4️⃣ 调试反射 / 访问权限问题

常见错误:

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)

5️⃣ IDE 调试(IntelliJ / Eclipse)

IntelliJ IDEA

  • Run → Edit Configurations
  • 在 VM options 加:
--module-path target/libs --add-modules com.example
  • 勾选 Include dependencies with “provided” scope

调试模块路径

在运行配置中确认:

  • ✅ Module path
  • ❌ 不要混用 classpath

6️⃣ 使用 jdeps 分析模块依赖

jdeps --module-path libs -m com.example

或查看 jar 是否需要拆模块:

jdeps --jdk-internals mylib.jar

✅ 适合:

  • 找“用了 JDK 内部 API”
  • 找“缺 requires”

7️⃣ 打印 Module 信息(代码级)

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()));

三、典型调试案例

❌ 问题:package com.x is not visible

com.x is not visible because package com.x is not exported

✅ 解决:

module com.lib {
    exports com.x;
}

调试方式:

java --describe-module com.lib

❌ 问题:反射访问 private 字段失败

field.setAccessible(true); // 抛异常

✅ 解决(调试/兼容):

--add-opens com.lib/com.lib.internal=ALL-UNNAMED

❌ 问题:ServiceLoader 找不到实现

ServiceLoader.load(MyService.class); // 空

检查:

  • module-info.java 是否有:
provides MyService with MyServiceImpl;
uses MyService;

四、调试总原则(很重要)

✅ 模块路径(module-path) ≠ 类路径(classpath)
✅ 报错先看:

  • requires
  • exports
  • opens ✅ 使用 --show-module-resolution 永远第一步

如果你愿意,可以:

  • 贴出你的 module-info.java
  • 或贴具体报错信息
    我可以帮你 精确定位并给出修改方案
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手