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

时间:2017-07-10 17:33:18

标签: java jmockit java-9 jigsaw

当我运行此测试时(使用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参数重新运行测试,但它运行正常,但我不太了解这里发生了什么。

为什么我会收到该例外?

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

已为JMockit 1.34确定issue

在启动期间,JMockit会修改JRE类(添加几个字段),以便为JRE类的模拟提供支持。被修改的实际类是任意的,并且javax.print.PrintException被用作(作为次要选择),因为它通常永远不会在典型的测试运行中加载。在JDK 9上,无法从" base"模块,所以它现在被另一个替换。