Seit einigen Jahren erscheinen halbjährlich neue Java-Versionen. In dieser Versionsflut stechen die LTS-Versionen (Long Term Support) heraus. Zuletzt war das Java 11, aktuell ist es Java 17. Eine gute Gelegenheit also, einen Blick auf die Neuerungen von Java der letzten Jahre zu werfen.
Archiv der Kategorie: Java
Kotlin-Updates: Kotlin 1.5.20
Mit diesem Artikel starte ich eine Serie von Update-Artikel zu meinem Kotlin-Buch. In diesem ersten Beitrag geht es um die Neuerungen in Kotlin von Version 1.4 bis zur aktuellen Version 1.5.20.
Sichere Passwort-Hashes in Java und Kotlin
Dass Passwörter nicht im Klartext gespeichert werden dürfen, sollte mittlerweile Allgemeinwissen sein: Sollte aus irgendeinem Grund die Benutzerdatenbank kompromittiert werden, bekäme der Angreifer Zugriff auf sämtliche Passwörter.
Lange Zeit lautete die Empfehlung, zuerst MD5-, dann SHA1- und schließlich SHA2-Hashes mit einem zufälligen Salt zu verwenden. Allerdings gelten die MD5- und SHA1-Algorithmen mittlerweile als unsicher. Bei SHA2 gibt es zwar noch keine fundamentalen Sicherheitsprobleme, aber der Algorithmus ist zu schnell. Sofern die Implementierung der Hash-Funktion bekannt ist, können CPUs/GPUs Millionen wenn nicht Milliarden von Passwörter pro Sekunde testen. Das ist besonders dann fatal, wenn unsichere Passwörter in der Art von 123456 oder topsecret zum Einsatz kommen, die in entsprechenden Passwort-Wörterbuchdateien an den ersten Stellen enthalten sind.
JavaFX-Programm mit Gradle
Seit JavaFX aus dem JDK entfernt wurde, ist es nicht mehr ganz einfach, ein minimalistisches JavaFX-Programm zu entwickeln. In der 3. Auflage meines Java-Grundkurses zeige ich, wie Sie die JavaFX-Bibliotheken manuell herunterladen und dann in ein IntelliJ-Projekt integrieren (Veränderung der Modulabhängigkeiten und der VM-Optionen). Das funktioniert, die resultierenden IntelliJ-Projekte laufen wegen der starr eingestellten Pfade aber nicht auf einem anderen Rechner. Besser ist es, das Build-Tool Gradle zu Hilfe zu nehmen.
Java 11, JavaFX, IntelliJ IDEA und Linux
Die Überschrift sagt schon alles: In diesem Beitrag geht es darum, Programme mit Java 11 und JavaFX in der IntelliJ IDEA unter Linux zu entwickeln. Als Testumgebung dienten Ubuntu 18.10 und Fedora 29. (Unter Ubuntu 18.04 stehen noch immer keine offiziellen Java-11-Pakete zur Verfügung.)
Java 11
Mit Java 11 liefert Oracle endlich, was sich viele Entwickler vor einem Jahr erwartet hatten: eine stabile Java-Version mit Langzeitwartung (LTS = Long Time Support). Unter diesem Gesichtspunkt kann man Java 9 und Java 10 eigentlich nur als öffentliche Betas betrachten, bereits nicht mehr gewartet und aus heutiger Sicht obsolet.
An sich wäre das alles in Ordnung, wenn Oracle diesen Release-Prozess ehrlich und früh genug kommuniziert hätte …
Update 24.10.2018: Ich habe das Kleingedruckte in der Support-Dokumentation von Oracle bisher zu ungenau gelesen. Java 11 ist eine LTS-Version — aber nur für zahlende Oracle-Kunden. Ohne Vertrag gibt es von Oracle überhaupt keine LTS-Version von Java mehr! (Quelle 1, Quelle 2) Wer nicht zahlt, muss alle sechs Monate ein Versions-Update mitmachen oder auf von der Community gewartete Java-Releases auf OpenJDK-Basis ausweichen.
Java 10
Nur sechs Monate nach Java 9 ist Java 10 fertig. Absurderweise ist damit Java 9, auf das die Java-Gemeinde dreieinhalb Jahre warten musste, schon wieder obsolet. Für Java 9 sind keine Updates mehr vorgesehen; aus Sicherheitsgründen ist ein Wechsel auf Java 10 also zwingend erforderlich. Auch Java 10 wird nur ein kurzes Leben haben: Im Herbst folgt bereits Java 11. Erst diese Version wird Long Time Support genießen, wobei aber noch unklar ist, wie lange die Long Time währen soll (siehe hier).
Die wichtigste Neuerung in Java 10 nennt sich Local-Variable Type Inference und erlaubt dem Compiler, den Variablentyp selbst zu erkennen. Die IntelliJ IDEA wird Java 10 ab Version 2018.1 unterstützen. Im aktuell verfügbaren Release Candidate funktioniert das schon wunderbar.
Java-Versions-Wahnsinn
Der Schritt von Java SE 8 hin zu Java SE 9 hat beachtliche dreieinhalb Jahre gedauert. Der Weg war steinig, und das hatte nicht nur mit der eigentlichen Implementierung der Neuerungen zu tun. Bis Java SE 9 im September 2017 endlich ausgeliefert werden konnte, mussten auch viele (firmen-)politische Differenzen ausgeräumt werden.
Nun haben wir also Java 9. Allmählich lernen IDEs wie Eclipse richtig mit den Neuerungen umzugehen, insbesondere also mit dem neuen Modulsystem. Langsam kommt Java 9 auf Rechnern in den Labors von Schulen und Universitäten bzw. in den Entwicklungsabteilungen von Firmen an. Noch langsamer etabliert sich OpenJDK 9 unter Linux. (In Ubuntu 17.10 ist OpenJDK 9 nur in der universe-Paketquelle, in Fedora 27 gilt OpenJDK 9 als Technology Preview. Bei den Enterprise-Distributionen ist ohnedies das Warten auf die nächste Version angesagt, oder natürlich die manuelle Installation abseits der offiziellen Paketquellen.)
Aktualisiert: 4.5.2018
Java 9: Collections komfortabler initialisieren
Viele Programmiersprachen kennen bequeme Kurzschreibweisen zur Initialisierung von Maps, Sets etc. In Java gibt’s das leider nur für Arrays (also int [] x = {1, 2, 3}
). Daran wird auch Java 9 nichts ändern, JEP186 wurde vorerst verworfen. Aber immerhin wurde stattdessen JEP269 implementiert. Dieser Erweiterungsvorschlag sieht die neue Methoden List.of
, Set.of
und Map.of
vor, mit denen sich Collections recht komfortabel initialisieren lassen. (JEP = JDK Enhancement Proposals).
Die Java-Shell (JShell)
Die für Einsteiger vermutlich nützlichste Neuerung in Java 9 besteht darin, dass es nun einen Kommandointerpreter gibt, die Java-Shell (JShell). In der Fachsprache heißt dieses Feature auch Read-Eval-Print-Loop (REPL). In anderen Sprachen wie Python oder Swift ist ein derartiger Kommandointerpreter ja schon seit jeher eine Selbstverständlichkeit.