Stolpersteine unter Java 9, Teil 1

Erstes Posting einer Reihe, die hoffentlich nicht allzu lang wird.

Java 9 ist gestern tatsächlich offiziell erschienen. Im Prinzip sind Jameica und Hibiscus bereits auf dieser Java-Version lauffähig. Leider hat Oracle aber ein paar Packages von der SE-Version in die EE-Version verschoben (keine Ahnung, ob das bei den ersten Betas auch schon so war). Das betrifft u.a. "javax.xml.bind" aber auch "javax.annotation" (dort ist z.Bsp. die Annotation "@Resource" enthalten). Die Packages sind zwar im JDK9 selbst enthalten, werden aber nicht mehr per Default zum Classpath hinzugefügt. Stattdessen liegen sie in Form von Modulen vor, die beim Start explizit angegeben werden müssen.

Wenn man Klassen aus den oben genannten Packages verwendet und jetzt beim Start seines Programmes unter Java 9 z.Bsp. die Fehlermeldung "java.lang.NoClassDefFoundError: javax/annotation/Resource" erhält, dann kann man den Programm-Aufruf in etwa so ergänzen:
java --add-modules=java.se.ee ....
Leider hat das einen unschönen Nebeneffekt. Der Parameter "--add-modules" existiert erst seit Java 9. Java 8 und ältere Versionen ignorieren ihn jedoch nicht einfach sondern brechen mit folgender Fehlermeldung ab:
Unrecognized option: --add-modules=java.se.ee
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
Findet der Aufruf z.Bsp. aus einem Shell-/Batch-Script heraus statt, dann müsste man eigentlich ein Script für Java 9 und eines für Java 8 erstellen. Sehr unpraktisch.

Glücklicherweise gibt es einen Workaround:

Mit Java 9 wurde eine neue Umgebungsvariable "JDK_JAVA_OPTIONS" eingeführt, in der man JVM-Parameter platzieren kann. Diese Umgebungsvariable wird von älteren Java-Versionen ignoriert. Damit kann man sein Shell-Script so ergänzen, dass vor dem eigentlichen Programmstart die Umgebungsvariable gesetzt wird:
export JDK_JAVA_OPTIONS='--add-modules=java.se.ee'
Der eigentliche Programmaufruf im Anschluss kann dann unverändert bleiben. Das Script funktioniert damit sowohl unter Java 9 als auch mit älteren Java-Versionen.

Siehe auch http://www.oracle.com/technetwork/java/javase/9-new-features-3745613.html#JDK-8170832

Trackbacks

Trackback-URL für diesen Eintrag

Dieser Link ist nicht aktiv. Er enthält die Trackback-URI zu diesem Eintrag. Sie können diese URI benutzen, um Ping- und Trackbacks von Ihrem eigenen Blog zu diesem Eintrag zu schicken. Um den Link zu kopieren, klicken Sie ihn mit der rechten Maustaste an und wählen "Verknüpfung kopieren" im Internet Explorer oder "Linkadresse kopieren" in Mozilla/Firefox.

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Alex am :

Hallo Olaf,

der Link

http://willuhn.de/blog/exit.php?url=aHR0cDovL2pkay5qYXZhLm5ldC85L3JlbGVhc2Utbm90ZXMjSkRLLTgxNzA4MzI=&entry_id=766

liefert leider nur:

404 Not Found
nginx

Liebe Grüße und Frohe Weihnachten!

Alex

Olaf am :

Die haben den Link offensichtlich geändert. Zu dem Zeitpunkt, als ich den Artikel schrieb, ging der Link. Hab ihn jetzt angepasst.

Daniel am :

Hallo,

unter Ubuntu 18.04 bekomme ich neuerdings den Fehler:

[ERROR][main][de.willuhn.jameica.system.Application.startupError] FATAL ERROR WHILE JAMEICA STARTUP
de.willuhn.jameica.system.JameicaException: UpdateSettingsView kann nicht erstellt werden: javax/annotation/Resource

Möglicherweise liegt das an der OpenJDK-Version; allerdings weiß ich nicht auswendig, welche Version Ubuntu 17.10 verwendete. Aktuell:

$ java --version
openjdk 10.0.1 2018-04-17
OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)

Ich schreibe diesen Kommentar hier, weil der oben beschriebene Workaround das Problem behebt:

$ JDK_JAVA_OPTIONS='--add-modules=java.se.ee' java -jar jameica-linux64.jar

Olaf am :

Du hast Java 10 installiert. Dort gilt das selbe wie fuer Java 9. Ich werde aber diese Woche ohnehin eine neue Jameica-Version veroeffentlichen, in der dieser Workaround bereits enthalten ist.

Die Kommentarfunktion wurde vom Besitzer dieses Blogs in diesem Eintrag deaktiviert.