Java 9 WTF?

Fails & Fixes: Dieser Code läuft nicht mit Java 9

Hartmut Schlosser

(c) Shutterstock / Lightspring

Während das Java-9-Entwicklerteam mit der Überarbeitung des Modulsystems Jigsaw beschäftigt ist, experimentiert die Community fleißig mit den Early-Access-Builds. Dabei zeigt sich, dass nicht aller Java-8-Code auch problemlos mit Java 9 funktioniert.

Java 9: Probleme & Lösungen

Nicht alle Java-Projekte werden ohne Modifikationen auch mit Java 9 laufen. Zwar wurde die strikte Kapselung interner APIs durch das Jigsaw-Modulsystem mittlerweile aufgelockert – in Java 9 wird es also doch per Default möglich sein, über Reflection Zugriff vom Quellcode aus auf den Klassenpfad zu erhalten. Dennoch sind die Änderungen teils gravierend, sodass auch an unerwarteten Stellen Kompatibilitätsprobleme entstehen können. Eine Sammlung solcher Probleme hat nun Nicolai Parlog auf der Seite http://java9.wtf/ angeregt.

Die Idee ist hier, in kleinen Beispielen Kompatibilitätsprobleme mit Java-9-Migrationen zu sammeln, die der Community in ihrer Praxis begegnen. Gleichzeitig sollen, wenn möglich, Fixes für die Problemfälle demonstriert werden.

Parlog hat bereits vier solche Probleme vorgelegt:

Beispielsweise scheint der Java-9-Compiler durch die neuen Sprachfeatures bzw. die strikteren Typenchecks neue Kompilier-Fehler zu produzieren. Parlog berichtet über Fälle, in denen die Typen-Inferenz des Java-9-Compilers anders arbeitet als gewohnt.

In dem unteren Beispiel zeigt Parlog, dass Fehler bei Casts entstehen können. Die Zeile mit dem Kommentar „fail“ funktioniert nicht. Eine Lösung des Problems zeigt die Zeile mit dem Kommentar „pass“ (getestet mit Jigsaw-Build 172).

public void spinnerModel(SpinnerNumberModel spinnerModel) {
	// this could have happened somewhere else:
	// spinnerModel.setMinimum(0);
	// spinnerModel.setMaximum(360);
	// spinnerModel.setValue(45);

	int newValue = (int) spinnerModel.getValue() + 1;
	newValue = Math.min(newValue, (int) spinnerModel.getMaximum()); // fail
	newValue = Math.max(newValue, (int) (Object) spinnerModel.getMinimum()); // pass
	spinnerModel.setValue(newValue);
}

Aufgefallen ist zudem, dass sich das Verhalten des XML Transformer javax.xml.transform.Transformer in Java 9 verändert hat und die Performnace bei der Arbeit mit den Noto Sans fonts mit Java 9 in den Keller geht. Außerdem bearbeitet das Maven JAXB2 Plug-in wohl keine Schema Bindings in Java 9:

Running the project with mvn clean test creates two generated-jaxb-*folders, one for the sources created by the plugin the other by the JAXB API. On Java 8 they are identical, on Java 9 they are not.

Wer in seinen Projekten ähnliche Probleme mit Java 9 entdeckt – oder Lösungen für bereits beschriebene Fälle kennt -, ist eingeladen, seine Erfahrungen mit der Community zu teilen.

Das geht einfach durch das Öffnen eines Issues auf GitHub. Ihre Beispiele sollten so klein wie möglich sein und aus einem Maven-Modul bestehen, in dem mvn clean test mit Java 8 erfolgreich ist, mit Java 9 aber scheitert. Zum guten Ton gehört ein aussagekräftiges Readme und die genaue Angabe, mit welchen Java-8- und Java-9-Versionen gearbeitet wurde.

Und wie gesagt: Damit andere profitieren, wäre eine Lösung des gefundenen Problems ideal!

Java 9 Bugfixing

Übrigens: Wenn es sich um einen schlichten Bug in Java 9 handelt, sollte er natürlich auch an das Java-9-Entwicklerteam gemeldet werden. Dieses ist nämlich derzeit fieberhaft damit beschäftigt, bis zum morgigen Donnerstag, 22. Juni den ersten Release-Kandidaten für Java 9 fertigzustellen. Dafür sollen zunächst alle Prio 1 Bugs (Showstopper) behoben werden, danach folgen die P2-P5 Bugs, wie Mark Reinhold auf der OpenJDK-Mailing-Liste ausführt.

Ein finaler Release-Kandidaten soll am 6. Juli bereitgestellt werden. Die allgemeine Verfügbarkeit von Java 9 – also das finale Release – ist für den 21. September 2017 vorgesehen. Diese Verschiebung war wegen der erneuten Überarbeitung der Jigsaw-Spezifikation nötig geworden.

Zur Übersicht hier nochmals die offizielle Release-Roadmap von Java 9:

2016/05/26 Feature Complete
2016/12/22 Feature Extension Complete
2017/01/05 Rampdown Start
2017/02/09 All Tests Run
2017/02/16 Zero Bug Bounce
2017/03/16 Rampdown Phase Two
2017/06/22 Initial Release Candidate
2017/07/06 Final Release Candidate
2017/09/21 General Availability

 

 

Verwandte Themen:

Geschrieben von
Hartmut Schlosser
Hartmut Schlosser
Hartmut Schlosser ist Redakteur und Online-Koordinator bei Software & Support Media. Seine Spezialgebiete liegen bei Java-Enterprise-Technologien, JavaFX, Eclipse und DevOps. Vor seiner Tätigkeit bei S & S Media studierte er Musik, Informatik, französische Philologie und Ethnologie.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.