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 …

Aktuelle IntelliJ-Versionen sind bereits kompatibel zu Java 11

Long Term Support

In der Support Roadmap verspricht Oracle, Java 11 regulär bis September 2023 mit Updates zu versorgen. Der »Extended Support« reicht sogar noch drei Jahre länger. Was den Support betrifft, ist Java 11 somit der logische Nachfolger von Java 8.

Die kommenden fünf Java-Versionen 12 bis 16, die im Halbjahresrhythmus erscheinen werden, genießen wie Java 9 und 10 keinen Long Term Support. Sie sind also nur für Entwickler gedacht, die gerne die neuesten Features ausprobieren. Die nächste LTS-Version wird voraussichtlich erst wieder Java 17 sein (geplant für Herbst 2021, siehe auch dieses Diagramm eines Ubuntu-Entwicklers).

Neue Funktionen

Java 11 bietet eine Menge neuer Funktionen, die sich primär an fortgeschrittene Entwickler bzw. an das Enterprise-Lager richten. Zu den wichtigsten Neuerungen zählen:

  • Zwei neue Garbage Collectors (JEP 318 und JEP 333)
  • var-Deklaration auch für Lambda-Parameter (JEP 323)
  • Eine neue HTTP-Client-API (JEP 321)
  • Unterstützung für Unicode 10 (JEP 327)
  • Unterstützung für TLS 3 (JEP 332)
  • Zusätzliche kryptografische Funktionen (ChaCha20 and Poly1305, JEP 329)

Einfachere Java-Ausführung für Einsteiger

Die interessanteste Neuerung für Java-Einsteiger ist ein neues Konzept zur Ausführung von Java-Programmen, die aus nur einer einzigen Datei bestehen (Launch Single-File Source-Code Programs, JEP 330). Derartige Programme können nun einfach mit java Quellcode.java gestartet werden. (Bisher musste der Code bekanntlich zuerst mit javac kompiliert werden. Im zweiten Schritt musste an java der Klassenname ohne die Endung .java oder .class übergeben werden — ein Punkt, der bei Einsteigern oft für Verwirrung sorgt.)

Wenn Sie also die folgende Datei in einem Verzeichnis gespeichert haben …

// Datei HelloWorld.java
public class HelloWorld {
        public static void main(String[] args) {
                System.out.println("Hello World!");
        }
}

… dann können Sie den Code nun wie folgt ausführen:

java HelloWorld.java

Das ist eigentlich eine feine Sache! Das Kompilat wird dabei nicht dauerhaft gespeichert (es entsteht also keine neue Datei HelloWorld.class), sondern nur im RAM zwischengespeichert.

ACHTUNG Die Code-Ausführung funktioniert nur, wenn Sie das Programm nicht vorher schon kompiliert haben! Wenn es im aktuellen Verzeichnis bereits die Datei HelloWorld.class gibt, dann kommt es zur verwirrenden Fehlermeldung class found on application class path: HelloWorld. Mit anderen Worten: java weiß nicht, ob es nun HelloWorld.java kompilieren und ausführen soll, oder ob Sie eigentlich die bereits kompilierte Klasse HelloWorld.class ausführen möchten.

Zu diesem Konzept gibt es einige Varianten. Die Ausführung gelingt auch, wenn die Code-Datei nicht die Endung .java hat. In diesem Fall erfolgt der Aufruf mit der Option java --source n, wobei n die Java-Versionsnummer ist:

java --source 11 HelloWorld.txt

Linux- und macOS-Fans können den Java-Code sogar als Script verpacken. Die erste Zeile des Scripts muss in diesem Fall mit #!/pfad/zu/java --source 11 beginnen, also z.B.:

#!/usr/bin/java --source 11
// Datei HelloWorld.script
public class HelloWorld {
        public static void main(String[] args) {
                System.out.println("Hello World!");
        }
}

Nach chmod +x HelloWorld.script können Sie die Datei nun mit ./HelloWorld.script ausführen. Abermals scheitert die Ausführung, wenn es im gleichen Verzeichnis bereits die Datei HelloWorld.class gibt. Anstelle von #!/usr/bin/java ist auch die portablere Variante #!/usr/bin/env java erlaubt.

Einige weitere Varianten mit mehreren Klassen in einer Datei sowie mit der Verwendung von import sind in diesem Blog-Beitrag dokumentiert.

Neue Zeichenkettenfunktionen

In Java 11 stehen auch sechs neue Methoden zur Bearbeitung von Zeichenketten zur Verfügung:

  • s.repeat(n) dupliziert s n-mal
  • s.lines() liefert einen Stream mit den Zeilen der Zeichenkette
  • s.isBlank() liefert true, wenn die Zeichenkette leer ist oder nur aus Whitespace besteht
  • s.stripLeading(), s.stripTrailing() und s.strip() liefert eine neue Zeichenkette, in der der Whitespace am Beginn und/oder Ende eliminiert ist

Der Unterschied zwischen trim und strip besteht darin, dass strip komplett Unicode-kompatibel ist. Die folgenden Zeilen zeigen die Anwendung der neuen Funktionen in der jshell.

jshell> var s=" abc "
s ==> " abc "

jshell> s.strip()
$2 ==> "abc"

jshell> "abc".repeat(3)
$8 ==> "abcabcabc"

jshell> s="Hello\nWorld!"
s ==> "Hello\nWorld!"

jshell> var lines = s.lines()
lines ==> java.util.stream.ReferencePipeline$Head@5f2108b5

jshell> lines.forEach(System.out::println)
Hello
World!

JavaFX

Mit Java 11 wurde JavaFX ausgegliedert. Das führt zur absurden Situation, dass die technologisch komplett veraltete Swing-Technologie weiter offiziell unterstützt wird, JavaFX aber nicht. Vielleicht sollte man es so formulieren: Nicht einmal Oracle glaubt daran, dass Java die richtige Sprache zur GUI-Entwicklung ist.

Persönlich finde ich das schade, weniger weil ich riesige JavaFX-Projekte entwickle, sondern mehr, weil JavaFX einen einfachen und eleganten Weg zur Realisierung einfacher Grafikprogramme bot.

JavaFX ist aber (noch) nicht (vollständig) tot. Vielmehr kümmert sich die Community nun um JavaFX, wobei die Firma Gluon dieKoordination übernommen hat. Zumindest für Version 11 hat das wunderbar funktioniert. JavaFX 11 wurde sogar eine Woche vor Java 11 freigegeben.

JavaFX steht auf der neuen Community-Website https://openjfx.io zum Download zur Verfügung. Für kommerzielle Kunden bietet Gluon Support-Verträge an.

Um also weiterhin JavaFX-Programme entwickeln zu können, müssen Sie das JavaFX SDK von hier herunterladen. Nach dem Auspacken der ZIP-Datei müssen Sie den Verzeichnisbaum an einen Ort verschieben, wo er für alle JavaFX-Benutzer zugänglich ist. Wenn JavaFX nur von einem einzelnen Benutzer verwendet wird, können Sie es auch im Home- oder Download-Verzeichnis belassen.

Um ein simples Hello-World-Programm zu kompilieren und auszuführen, sind die folgenden Anweisungen erforderlich (hier für macOS):

export FXPATH=/Users/kofler/Downloads/javafx-sdk-11/lib/
javac --module-path $FXPATH --add-modules=javafx.controls HelloFX.java 
java  --module-path $FXPATH --add-modules=javafx.controls HelloFX

Um JavaFX in einem IntelliJ-Projekt ohne Maven, Gradle oder andere externe Tools zu verwenden, müssen Sie zwei Dinge tun:

  • Im Dialog File/Project Structure, Dialogblatt Modules wählen Sie mit dem Plus-Button JARs or directories aus und geben dann den Pfad zu Ihren lokalen JavaFX-Dateien an, also z.B. /Users/kofler/Downloads/javafx-sdk-11/lib/. Damit sollte IntelliJ im Quellcode alle javafx-Importe verstehen und in der Lage sein, das Programm zu kompilieren.

  • Im Dialog Run/Edit Configuration fügen Sie bei den VM options die folgenden zwei Optionen hinzu. (Dabei müssen Sie natürlich den Pfad durch den Ort auf Ihrem Rechner ersetzen.)

--module-path /Users/kofler/Downloads/javafx-sdk-11/lib --add-modules=javafx.controls,javafx.fxml
JavaFX-Bibliothek in IntelliJ hinzufügen
Erforderliche Optionen, damit IntelliJ ein JavaFX-Programm ausführen kann

Java 11 unter Linux

Ubuntu hat versprochen, die Java-Pakete in Ubuntu 18.04 automatisch auf Version 11 zu aktualisieren. Bisher ist das noch nicht der Fall. Ähnlich sieht es in der Beta für Ubuntu 18.10 aus. Die Paketnamen lauten zwar bereits openjdk-11-xxx, aber javac -version liefert 10.0.2.

Die Beta von Fedora 29 enthält immerhin schon eine Early-Access-Version von Java 11.

Wie gut JavaFX im Zusammenspiel mit Java 11 unter Linux funktioniert, werde ich mir ansehen, wenn es finale Versionen von Ubuntu 18.10 und Fedora 29 gibt.

Quellen und Links

JavaFX

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Wenn Sie hier einen Kommentar absenden, erklären Sie sich mit der folgenden Datenschutzerklärung einverstanden.