【问题标题】:module java.base does not read module java.desktop模块 java.base 不读取模块 java.desktop
【发布时间】:2017-12-14 13:27:24
【问题描述】:

当我运行这个测试时(使用 jmockit 和 TestNG,不确定这是否相关):

public class Test {
  @Test public void test(@Mocked ProcessBuilder pb) throws IOException {
    new Expectations() {{ pb.start(); result = null; }};
    assertNull(m());
  }

  public static Process m() throws IOException {
    return new ProcessBuilder("").start();
  }
}

我得到了这个例外:

java.lang.IllegalAccessError: class java.lang.ProcessBuilder (in module java.base) cannot access class javax.print.PrintException (in module java.desktop) because module java.base does not read module java.desktop

at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java)
....

我正在使用 build 177。

我可以使用 --add-reads java.base=java.desktop 参数重新运行测试,它工作正常,但我不太明白这里发生了什么。

为什么会出现这个异常?

【问题讨论】:

  • 我的猜测是与隐式加载的类的一些交互; PrintException 确实扩展了 IOException,当使用与 Swing 不明显相关的东西时,这感觉就像莫名其妙的 HeadlessExceptions。我建议提交一个关于可能的隐藏类依赖的错误。
  • 类/jar 是在模块路径还是类路径上?是否为您的代码定义了任何模块?
  • @MichaelEaster 在类路径上 - 我没有定义任何模块。这是一个简单的项目,带有一个 pom.xml,它依赖于 TestNG 和 jmockit 以及一个文件(问题中的 Test 类)。该 pom 包含一个 -Djdk.attach.allowAttachSelf 的 argLine 以确保允许 jmockit 运行。

标签: java jmockit java-9 java-platform-module-system


【解决方案1】:

IllegalAccessError 提示 JMockit 已通过对 java.desktop 模块中的异常的引用来检测 ProcessBuilder(在 java.base 中)。我不知道它为什么选择这个例外,这可能是 JMockit 邮件列表的东西。但是它确实解释了为什么 --add-reads 解决了这个问题。

【讨论】:

【解决方案2】:

issue 已为 JMockit 1.34 修复。

在启动期间,JMockit 会修改一个 JRE 类(添加一些字段),以便为 JRE 类的模拟提供支持。被修改的实际类是任意的,使用javax.print.PrintException(作为次要选择)只是因为它通常不会在典型的测试运行中加载。在 JDK 9 上,这个类不能从“基础”模块访问,所以它现在被另一个替换了。

【讨论】:

    猜你喜欢
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 2022-08-09
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多