Wenn ich diesen Test ausführen (JMockit und TestNG verwendet wird, nicht sicher, ob das relevant):Modul java.base nicht Modul liest java.desktop
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();
}
}
Ich erhalte diese Ausnahme:
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)
....
Ich benutze Build 177.
Ich kann den Test mit --add-reads java.base=java.desktop
Argument wiederholen und es funktioniert gut, aber ich verstehe nicht wirklich, was hier passiert.
Warum bekomme ich diese Ausnahme?
Meine Vermutung wäre eine Interaktion mit Klassen, die implizit geladen werden; 'PrintException' erweitert' IOException' und fühlt sich * wie die unerklärliche 'HeadlessException' an, wenn etwas benutzt wird, das nicht offensichtlich Swing-bezogen ist. Ich schlage vor, einen Fehler über eine mögliche versteckte Klassenabhängigkeit einzureichen. – chrylis
Sind die Klassen/jars auf dem Modulpfad oder dem Klassenpfad? Sind irgendwelche Module für Ihren Code definiert? –
@MichaelOster auf dem Klassenpfad - Ich habe kein Modul definiert. Es ist ein einfaches Projekt mit einer pom.xml mit einer Abhängigkeit von TestNG und jmockit und einer Datei (die Test-Klasse in der Frage). Der Pom enthält eine argLine von '-Djdk.attach.allowAttachSelf' für todsichere Datei, damit jmockit ausgeführt werden kann. – assylias