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