Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

module java.base does not read module java.desktop

When I run this test (using jmockit and TestNG, not sure if that's relevant):

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

I get this exception:

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)
....

I am using build 177.

I can rerun the test using --add-reads java.base=java.desktop argument and it works fine but I don't really understand what is happening here.

Why am I getting that exception?

like image 550
assylias Avatar asked Jul 10 '17 17:07

assylias


2 Answers

The IllegalAccessError hints that JMockit has instrumented ProcessBuilder (in java.base) with a reference to an exception in the java.desktop module. I don't know why it choose this exception, that may be something for the JMockit mailing list. However it does explain why --add-reads fixes the issue.

like image 56
Alan Bateman Avatar answered Sep 19 '22 00:09

Alan Bateman


The issue has been fixed for JMockit 1.34.

During startup, JMockit modifies a JRE class (adding a few fields) in order to provide support for the mocking of JRE classes. The actual class which gets modified is arbitrary, and javax.print.PrintException was used (as a secondary choice) just because it usually never gets loaded in a typical test run. On JDK 9, this class is not accessible from the "base" module, so it was now replaced by another one which is.

like image 37
Rogério Avatar answered Sep 20 '22 00:09

Rogério