Das Java-Modulsystem Jigsaw ist eine gute Basis für komponentenorientierte Softwareentwicklung
Java 9 ist seit September 2017 verfügbar und bringt viele neue Features mit – unter anderem das neue Modulsystem Jigsaw. Martin Lehmann und Dr. Kristine Schaal von Accso berichten nach ihrem erfolgreichen Tutorial und ihrem Workshop auf den IT-Tagen 2017 im Interview über ihre Erfahrungen mit Java 9, die neuen Features und ihre Erwartungen an die zukünftigen Entwicklungen von Java.
Informatik Aktuell: Welche sind die wichtigsten Neuerungen, die mit Java 9 kommen?
Martin Lehmann: Die mit Abstand wichtigste und größte Neuerung von Java 9 ist das neue Modulsystem Jigsaw. Dieses hat weitreichende Konsequenzen, auch für das eigene Komponenten-Design. Aber auch wer Module selbst erst mal noch gar nicht nutzen möchte, wird mit Jigsaw bei der Migration nach Java 9 konfrontiert: Da sich JDK-Struktur sowie Sichtbarkeiten auf Java-interne APIs ändern, zieht sich Jigsaw durch die gesamte Entwicklungs- und Deployment-Toolkette von IDEs wie Eclipse oder Intellij über Build-Systeme wie Maven und Gradle bis hin zu benutzten App-Servern und Containern, Frameworks und Bibliotheken.
Neben Jigsaw gibt es verschiedene kleinere Neuerungen aller Art, darunter Sprachergänzungen im Project Coin (JEP213), neue Kommandozeilenoptionen im GNU-Stil (JEP293) und neue Deprecation-Optionen (JEP277). Einige alte APIs sind nun deprecated (JEP289). Neue APIs wie Stack-Walking, Process-API, Reactive Streams, HTTP/2 und ein paar andere sind dazugekommen (u.a. JEPs 259, 102, 266, 110). Außerdem neu dabei oder erweitert: JShell (JEP222), Multi-Release JARs (JEP238), G1 als Default-Garbage-Collector (JEP248), JavaDoc-Erweiterungen mit HTML5 und Suche (JEPs 224 und 225), Compact Strings (JEP254) und Unified Logging (JEP 158 und 271). Und darüber hinaus gibt es nun Support für Unicode 8.0 (JEP267), und Property-Dateien sind nun auch UTF-8-fähig (JEP226).
Informatik Aktuell: Was bringt einem ein Modulsystem wie Jigsaw? Hat dies wirklich einen Nutzen für aktuelle Projekte?
Kristine Schaal: Ein Modulsystem wie Jigsaw bildet eine gute Basis, um komponentenorientierte Software zu entwickeln. Komponenten sind eigentlich nichts Neues: Als eigenständige, wiederverwendbare "Softwarebausteine" haben sie wohldefinierte Schnittstellen, über die andere sie benutzen. Ihre Implementierung ist versteckt und man kann von außen nicht darauf zugreifen. Deshalb können die Entwickler einer Komponente die Implementierung flexibel verändern.
Klassen oder Packages sind für ein Komponentendesign meist zu klein, zu feingranular. Daher fehlten in Java bisher die Konzepte, um Komponenten und Zugriffsschutz auch auf Sprachebene abbilden zu können. Natürlich konnte man auch schon vor Jigsaw eigene Java-Komponenten designen, so beispielsweise als Maven-Artefakte. Und auch das JDK selber bestand schon immer aus verschiedenen Komponenten, konnte aber seine Implementierungsdetails nicht verstecken, so dass immer wieder Code entstand, der gewollt oder ungewollt JDK-Interna nutzte. Das machte dringend notwendige oder gewünschte Änderungen aus Abwärtskompatibilitätsgründen schwer bis unmöglich. Ein zentraler Aspekt von Jigsaw sind nun genau diese Konzepte: Komponenten mit klarer öffentlicher Schnittstelle definieren und kein Zugriff auf das Implementierungsgeheimnis.
Informatik Aktuell: Wird Jigsaw denn jetzt schon in Projekten genutzt?
Martin Lehmann: Java 9 ist ja, nach vielen Verzögerungen, erst im September 2017 erschienen. Ich vermute, dass sich noch niemand an eine Migration einer mittelgroßen oder gar großen Anwendung gewagt hat, ich kenne zumindest kein Beispiel. Jigsaw zieht sich "quer durch" Plattform und Sprache: Nicht nur eigener Anwendungscode, sondern auch Drittbibliotheken bis hin zu Tools und Entwicklungsumgebung müssen mitspielen. Und da liegt der Teufel im Detail: Denn da nun einige interne JDK-APIs nicht mehr zugreifbar sind, müssen manche Bibliotheken und Tools eventuell ebenfalls auf neue Versionen aktualisiert werden, da sie sonst nicht mehr funktionieren oder – schlimmer noch – Laufzeitfehler verursachen. Beispiele: Eclipse-Nutzer brauchen mindestens Version 4.7.1a (Oxygen.1.A), sonst kann man nicht mit Java 9 arbeiten. Maven-Nutzer brauchen mindestens Compiler-Plugin 3.7.0.
Es ist also sehr wahrscheinlich, dass man erst mal sein Ökosystem aktualisieren muss, bevor man eigenen Code migriert. Und das dauert sicher eine Weile und muss sauber getestet werden. Denn sonst arbeitet man an zu vielen Baustellen gleichzeitig.
Vieles an externem Dritt-Code und Bibliotheken ist schon auf Java 9 migriert, gerade einige bekannte Open Source-Maintainer wie z. B. Robert Scholte für Maven waren früh in die Jigsaw-Entwicklung involviert und haben wertvolles Feedback gegeben. Allerdings sollte man sich mit einer Migration grundsätzlich beschäftigen, besser früher als später. Anders als beispielsweise bei Lambdas in Java 8 oder Generics in Java 1.5 hat man hier nicht "nur" ein neues Sprachfeature, das man nutzen kann oder eben nicht.
Informatik Aktuell: Sollte Jigsaw eher nur in Neu-Entwicklungen eingesetzt werden? Oder lohnt der Umstieg auch bei vorhandener Software?
Kristine Schaal: Wir sollten hier drei Aspekte unterscheiden: Erstens die Frage nach einer Aktualisierung des Ökosystems, wie eben angesprochen. Zweitens die Frage, ob und wie einfach man eine bestehende Anwendung nach Java 9 migriert, also mit mehr oder weniger viel Aufwand "einfach" auf Java 9 heben kann. Und drittens, ob man überhaupt eigene Komponenten als Jigsaw-Module nutzen will.
In einer Neuentwicklung auf der grünen Wiese ist ein Komponentendesign auf Basis von Jigsaw natürlich viel einfacher möglich, da man keine oder nur wenig technische Kompromisse mit "Altlasten" eingehen muss. Hier empfehlen wir klar, das Jigsaw-Modulkonzept auch zu nutzen, das – trotz einiger Unzulänglichkeiten – das Design von komponentenbasierter Software prinzipiell gut unterstützt.
Eine Migration einer vorhandenen Anwendung sehe ich differenzierter: Nur um der "Module willen" in eine bestehende Anwendung noch Module "einzuziehen", halte ich nicht für sinnvoll. Wenn man jedoch sowieso größere Refactorings und architektonische Umbauten vornimmt oder ganze Anwendungsteile neu entwickelt, sollte man darüber nachdenken. Hier kann man keine pauschale Empfehlung aussprechen. Wer heute schon z. B. mit Maven-Artefakten und durch statische Architekturchecks einen guten Komponentenschnitt definiert und durchsetzt, der kann durch eine Migration auf Jigsaw zwar nicht mehr so viel gewinnen. Aber bei einem guten Schnitt fällt die Migration vermutlich leicht.
Informatik Aktuell: Was genau ist JShell? Und wie ist der Einsatz von JShell zu bewerten?
Martin Lehmann: JShell implementiert das Prinzip REPL (Read–Eval–Print Loop). Damit erhält ein Java-Programmierer eine interaktive Shell, in der er Java programmieren und ausführen kann. Er bekommt also direktes Feedback und muss nicht erst warten, bis das Programm kompiliert und gestartet ist. Andere Programmiersprachen haben solche Shells schon sehr lange und auch auf der JVM sind schon REPL-Shells verfügbar, z. B. für Groovy, Scala und Clojure. Von daher glaubte man im Java-Team wohl, hier nachziehen zu müssen.
Nützlich ist eine solche REPL-Shell eigentlich immer dann, wenn man auf sehr direkte Rückmeldung angewiesen ist. Für prototypische Entwicklung und erste Schritte mit neuen APIs kann das wertvoll sein. REPL-Shells werden daher auch gerne dafür eingesetzt, eine Programmiersprache neu zu erlernen. Für den typischen Programmiereralltag hat JShell für mich aber nicht den großen praktischen Nutzen, ist eher im Ausnahmefall relevant. Heutige IDEs bieten derart gute Unterstützung wie z. B. Auto-Completion und JavaDoc-Tooltips, dass ich persönlich bis dato eine solche JShell für Java noch nicht vermisst habe.
Informatik Aktuell: Welche neuen Features bringt Java 9 denn außer Jigsaw und JShell? Welche davon haben den größten Nutzen?
Martin Lehmann: Neben den prominenten Neuerungen JShell und Jigsaw gibt es wie erwähnt eine Reihe neuer APIs. Diese haben aber eher evolutionären Charakter, revolutionär sind diese eher nicht.
Sehr nützlich ist noch eine weitere Java 9-Neuerung "unter der Haube": Mit Compact Strings (JEP254) wurde der Memory-Footprint von Strings optimiert. java.lang.String nutzt nun intern (und damit abwärtskompatibel) ein Byte-Array statt eines Char-Arrays für seine Zeichenfolge. Je nach benötigtem Encoding werden nun entweder ein oder zwei Byte pro Zeichen benötigt. Bisher waren immer zwei Byte pro UTF-16-Zeichen reserviert, womit bei heutigen vielen Anwendungen geschätzt 20-30 Prozent des Speichers brachliegen. JEP254 ist mit Java 9 automatisch aktiviert, kann aber abgeschaltet werden. Das Feature ist für sehr viele, wenn nicht gar für alle "normalen" Anwendungen relevant und sehr nützlich.
Informatik Aktuell: Welche praktischen Erfahrungen gibt es mit Java 9 bereits?
Martin Lehmann: Eine Migration von Produktivcode kenne ich zum heutigen Zeitpunkt nicht. Allerdings ist das Interesse an Jigsaw in der Java-Community sehr groß. Viele haben sicher schon mal eine Spielanwendung testweise mit Java 9 gebaut und im besten Fall auch laufen lassen.
Wir selbst haben seit Mitte 2016 die Jigsaw-Entwicklung intensiv verfolgt und unsere Erkenntnisse immer wieder in unsere Beispielsammlung auf Github einfließen lassen [1]. Vielleicht ist diese Sammlung ja für den einen oder anderen eine hilfreiche Informationsquelle.
Informatik Aktuell: Wann werden Unternehmen auf Java 9 umstellen?
Kristine Schaal: Jigsaw ist das wesentliche Feature in Java 9. An Jigsaw kommt man also nicht vorbei. Wie schon angesprochen, "trifft" Jigsaw also auch Drittbibliotheken und Tools. Daher werden sich viele Unternehmen wohl konservativ erst mal für Abwarten entscheiden.
Jedoch: Der Support für Java 8 läuft bald aus. Nach letztem Stand geht er nun bis Januar 2019. Das setzt Unternehmen natürlich unter Zugzwang. Und die nächsten Java-Releases kommen bald: Mit Java 10 werden die Java-Maintainer ihre Release-Politik auf einen sechsmonatlichen "Release-Train" ändern (JEP322). Neue Releases entstehen dann also halbjährlich – schon im März 2018 folgt JDK 10, im September dann JDK 11. Anders als früher wartet man also nicht mehr, bis alle Inhalte für das Java-Release fertig sind. Stattdessen entsteht das neue Java-Release eben mit nur den Features, die zum Zielzeitpunkt verfügbar sind. Die Supportzeiträume dürften entsprechend kürzer ausfallen.
Informatik Aktuell: Wie groß ist der Aufwand der Umstellung?
Martin Lehmann: Eine reine Plattformmigration nach Java 9 ist möglich. Man kann also erst mal seine bestehende Anwendung 1:1 auf Java 9 migrieren, ohne selbst Module schreiben zu müssen. Allerdings ist das JDK selbst in Module unterteilt und manche internen APIs sind in Java 9 gekapselt und nicht mehr zugreifbar. Für manche APIs gibt es Ersatz, so beispielsweise für den beliebten sun.misc.BASE64Encoder. Dieser wurde durch den neuen java.util.Base64.Encoder ersetzt. Auch andere APIs werden schrittweise abgelöst und später gar nicht mehr zugänglich sein. Details siehe JEP 260.
Sobald man derlei technische Detail-Klippen umschifft hat, ist eine Migration rein auf die neue Java9-Plattform nicht so schwierig. Wer aber viele externe Dritt-Abhängigkeiten für Entwicklung, Test und Produktivcode hat, muss diese vorher unter Umständen aktualisieren, und das ist sicher aufwändig. Ein letztes Detail dazu: In Java 9 hat sich auch der Versionsstring geändert, wie "java –version" zeigt: Es fehlt nun das führende "1.", stattdessen wird als Version "9" angezeigt. Was sich nach einer Trivialität anhört, macht tatsächlich diversen Bibliotheken und auch Maven-Plugins Probleme, sobald diese auf die benutzte Java-Version abtesten. Das alleine kann dazu führen, dass man beim Umstieg nach Java 9 hier gleichzeitig auf neue Bibliotheks- oder Plugin-Versionen umstellen muss, die mit dem neuen Java-Versionsstring zurechtkommen.
Informatik Aktuell: Ist eine Umstellung ohne Begleitung möglich? Oder empfiehlt es sich, Consulting zu Java 9 bei einer Umstellung ins Projekt zu holen?
Martin Lehmann: Spannende Frage, vor allem, wenn Sie sie an uns als IT-Consultants stellen – Bei einer Migration helfen wir natürlich gerne. Eine gewiße Erfahrung für Umstellungsvorhaben sollte man schon mitbringen. Und dabei geht es nicht nur um technisches Detailverständnis, sondern auch darum, eine Migration sicher und sauber zu planen, zu testen und umzusetzen. Kleine Schritte, alle einzeln abprüfbar. Der große Big-Bang, der alles auf einen Rutsch und auf einmal umsetzt, dürfte zu riskant sein.
Nicht zuletzt braucht man ein passendes Testkonzept, das nicht nur bekannte Testfälle auf Korrektheit abprüft. Verschiedene Probleme einer Migration nach Java 9 sieht man erst als Laufzeitfehler. Daher ist dringend geboten, Integrations- und Performance-Tests zu konzipieren, am besten automatisiert.
Informatik Aktuell: Was können Entwickler/innen von der nächsten Version – nach Java 9 – erwarten? Was ist hier geplant?
Kristine Schaal: JDK 10 steht quasi vor der Tür, ist geplant für März 2018. Die genauen Inhalte stehen noch nicht fest, aber das spannendste Sprachfeature ist "Local-Variable Type Inference". Der JEP 286 legt fest, dass der Compiler bei lokalen Variablen mit Initialisierung ihren Typ automatisch erkennt, sprich inferieren kann. Das sorgt für bessere Code-Lesbarkeit, gibt aber statische Typisierung nicht auf! Dieses Feature ist Teil von Project Amber, das einige nette Sprachneuerungen nach Java bringt, die man in anderen Programmiersprachen schätzen gelernt hat. Für JDK 11 hoffen wir auf "Value Objects" aus dem Project Valhalla, also auf native Unterstützung von "Immutable Datentypen".
Informatik Aktuell: Wie sieht die generelle Weiterentwicklung von Java aus? Wo wird Java in fünf Jahren stehen? Welche Entwicklungen sind hier zu erwarten?
Kristine Schaal: Was wir den Java-Entwicklern unbedingt mitgeben möchten: Vergesst nicht Euer Ökosystem! Das ist aus unserer Sicht nicht immer gut gelaufen bei der Entwicklung von Jigsaw. Beispielsweise wurde eine ausreichende Unterstützung von Reflection zunächst vernachlässigt – ein entscheidendes Feature für Frameworks wie Spring oder Hibernate. Gerade das große und lebendige Ökosystem ist aber ein wichtiger Grund für die Beliebtheit von Java. Auch wenn manche Kritik im Detail noch aufgegriffen wurde, hätte man sich eine bessere und intensivere Einbindung gewünscht.
Martin Lehmann: Gerade bei Jigsaw wirkt vieles, als ob es primär auf die Modularisierung des JDK zugeschnitten ist. Aber Komponentendesign in Anwendungen funktioniert oft anders. Den schweren Schritt, Modulgrenzen in das JDK einzuziehen, hat man nun einmal gemacht. Das wird sich auszahlen, denn nun sind interne JDK-Implementierungen geschützt. Damit haben die Java-Maintainer zukünftig mehr Freiheiten, auch mal aufzuräumen und alte Zöpfe abzuschneiden. So wichtig und richtig die Abwärtskompatibilität von Java auch ist: Manchmal wünscht man sich mehr Dynamik in der Weiterentwicklung von Sprache und Ökosystem. Von daher unterstützt Jigsaw den prinzipiellen Weg, einerseits eine verlässliche, abwärtskompatible Plattform zu bieten, andererseits aber dynamisch Neuerungen wie z. B. Lambdas aufzugreifen. Wir denken und hoffen daher, dass uns Java als Programmiersprache und vor allem die JVM als Plattform noch lange begleiten werden.
Informatik Aktuell: Vielen Dank Ihnen beiden für das Gespräch!
Accso
Accso ist der Spezialist für anspruchsvolle individuelle IT-Lösungen. Wir realisieren maßgeschneiderte Lösungen in enger und vertrauensvoller Zusammenarbeit mit namhaften Unternehmen unterschiedlicher Branchen, mit denen diese erhebliche Wettbewerbs- oder Kostenvorteile erzielen. Methodische, effektive und absolut zuverlässige Projektarbeit ist die Kompetenz, die wir in diese Zusammenarbeit einbringen. Damit unterstützen wir unsere Kunden maßgeblich bei der Innovation ihrer Produkte und Dienstleistungen.
Weitere Informationen:
Informatik Aktuell – Dr. Rüdiger Grammes, Martin Lehmann & Dr. Kristine Schaal: Java 9: Das neue Modulsystem Jigsaw – Tutorial