模块java.base不读取模块java.desktop

ass*_*ias 6 java jmockit java-platform-module-system java-9

当我运行此测试时(使用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();
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

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)
....
Run Code Online (Sandbox Code Playgroud)

我正在使用build 177.

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

为什么我得到那个例外?

Ala*_*man 8

IllegalAccessError提示JMockit已经在java.desktop模块中引用了异常的ProcessBuilder(在java.base中).我不知道它为什么选择这个例外,这可能是JMockit邮件列表的内容.但它确实解释了为什么要--add-reads修复这个问题.

  • 谢谢 - 我在那里提出了这个问题:https://github.com/jmockit/jmockit1/issues/428 (3认同)

Rog*_*rio 2

JMockit 1.34 已修复此问题。

在启动过程中,JMockit 修改 JRE 类(添加一些字段),以便为 JRE 类的模拟提供支持。被修改的实际类是任意的,并且javax.print.PrintException被使用(作为次要选择)只是因为它通常永远不会在典型的测试运行中加载。在 JDK 9 上,此类无法从“base”模块访问,因此它现在被另一个可以访问的类所取代。