7 min. reading time

Der Artikel beschreibt die Lösung für mögliche Stolpersteine bei der Bewältigung eines Umstiegs von Oracle JDK auf OpenJDK 11 bei der PDE-Entwicklung mit GEF und JavaFX.

Eclipse-Entwicklung mit Java und JavaFX

„Legacy – mit einbetonierten Füßen in die Zukunft“ las ich kürzlich in einer Ankündigung und stellte mir die Frage, ob wir uns mit Java 8 in Kürze bereits auch mit Betonschuhen auf den Weg in die technologische Zukunft begeben. Doch bevor es dazu kommt, streifen wir diese lieber ab und migrieren auf eine aktuelle Java-Version.

Wir konzentrieren uns nachfolgend auf eine eclipsebasierte Anwendung mit JavaFX-Bestandteilen. Die Umstellung soll auf die neueste Java-LTE-Version erfolgen, also Java 11. Dass viele Entwickler noch vorsichtig bezüglich der Migration auf die höheren Java-Versionen sind, verdeutlicht die nachfolgende Umfrage:

jaxenter

JavaFX ist ab Java 11 kein JRE-Bestandteil mehr

Bei der Umstellung auf Java 11 zeigt sich bereits die erste Hürde, denn JavaFX ist nicht mehr Bestandteil des JDK, weder bei Oracle noch in der Open-Source-Distribution OpenJDK. Es gibt für dieses Problem mehrere Lösungsmöglichkeiten. Eine wäre die Verwendung einer JDK-Distribution, die Java 11 mit JavaFX ausliefert, beispielsweise Liberica JDK von Bellsoft. Dieser Artikel konzentriert sich jedoch auf die Verwendung von e(fx)clipse und dem OpenJFX-SDK.

Wir verwenden JavaFX in unseren YAKINDU-Produkten und haben exemplarisch und erfolgreich die Entwicklung des GEF-Frameworks auf die folgende Konfiguration umgestellt:

Im Folgenden stellen wir einerseits unsere Entwicklungsumgebung auf OpenJDK 11 mit OpenJFX und e(fx)clipse um und wenden uns anschließend der Umstellung für unsere Entwicklung zu, einschließlich des Compilers und der Launch-Konfigurationen.

Umstellung der Entwicklungsumgebung

Wir laden uns gegebenenfalls eine neue Eclipse-IDE herunter, idealerweise die für Eclipse-Committer, und installieren sie.

Wir laden OpenJDK 11 in ein beliebiges Verzeichnis.

Wir laden OpenJFX SDK herunter und speichern es in einem Verzeichnis.

Wir installieren e(fx)clipse mindestens in der Version 3.6.0 in unser Eclipse (Update-Site: https://download.eclipse.org/efxclipse/updates-nightly/site/).

Wir beenden Eclipse und fügen folgende Zeilen unterhalb der „-vmargs”-Zeile in die Datei eclipse.ini ein („--add-modules=ALL-SYSTEM” muss nicht erneut eingefügt werden, falls bereits vorhanden):

-Dosgi.framework.extensions=org.eclipse.fx.osgi
-Defxclipse.java-modules.dir=C:\Program 
Files\Java\javafx-sdk-11.0.2\lib --add-modules=ALL-SYSTEM

Zu beachten: Den Pfad zu den OpenJFX-Libraries passen wir entsprechend dem Betriebssystem und dem Ort im Dateisystem an. Wir verwende keine Anführungszeichen, selbst dann nicht, wenn der Pfad Leerzeichen enthält. Andernfalls würde die Einstellung stillschweigend ignoriert werden. Desweiteren darf der Pfad nicht mit einem Slash oder Backslash beendet werden. Die Änderungen an der eclipse.ini müssen nach der Installation von e(fx)clipse durchgeführt werden, da ansonsten Eclipse nicht mehr startet.

Ist OpenJDK 11 das einzige installierte JDK, muss nichts weiter geändert werden. Falls OpenJDK 11 nicht installiert, sondern nur entpackt ist oder noch weitere Java-Versionen auf dem Rechner installiert sind, dann sollten zusätzlich folgende Zeilen in der eclipse.ini direkt über der „-vmargs”-Zeile eingefügt werden:

-vm 
/path/to/jdk-11.0.5+10/Contents/Home/bin

Nun starten wir Eclipse erneut. Anschließend installieren wir über die Updatesite des Eclipse-Releases (zum Beispiel http://download.eclipse.org/releases/2019-06) die End-User-Tools von GEF DOT. Diese verwenden JavaFX (und die SWT-Integration), damit wir prüfen können, ob unsere Installation funktioniert hat. Im Erfolgsfall sollte die „DOT Graph”-View so aussehen:

Im Fehlerfall sieht die View so aus:

Mögliche Fehlerquelle sind hier die Einstellungen in der eclipse.ini, die wir uns Schritt für Schritt noch einmal anschauen sollten.

Läuft die IDE schließlich erfolgreich mit OpenJDK 11, OpenJFX 11 und e(fx)clipse, so kümmern wir uns nun um den Workspace und die Runtime.

Stelle deine Entwicklung um

Um die Entwicklung umzustellen, ist folgendes zu tun:

  • OpenJDK als zu verwendende JRE einstellen
  • Sicherstellen, dass dieses JRE als Execution-Environment verwendet wird
  • In den e(fx)clipse-Preferences den Ordner der openjfx-libs einstellen

Mit diesen Änderungen sollte der Workspace kompilieren. Der folgende Abschnitt beschreibt diese Schritte ausführlicher.

Wir stellen OpenJDK als Runtime-Environment in den Eclipse-Preferences ein. Hierzu wählen wir im Menu „Window → Preferences → Java → Installed JREs → Add … und den Pfad zum bin-Verzeichnis des JDK.

Wir stellen sicher, dass dieses JDK für das bei uns eingestellte Execution-Environment angewendet wird. Gegebenenfalls entfernen wir alle anderen JDKs, um sicherzustellen, dass auch wirklich das OpenJDK verwendet wird:

Wir stellen das OpenJFX-SDK in den Preferences für e(fx)clipse ein. Oben haben wir das OpenJFX-SDK in ein Verzeichnis gespeichert. Dessen lib-Verzeichnis muss in den Eclipse-Preferences (Window → Preferences → JavaFX) unter JavaFX 11 + SDK eingetragen werden. Das sollte derselbe Pfad sein wie zuvor in der eclipse.ini. Diese Einstellung macht deinem Eclipse die JavaFX-Libraries für die Entwicklung bekannt.

Nun ist alles dafür getan, dass der Workspace kompiliert. Wollen wir die Anwendung in der Runtime starten, so ist noch eine Kleinigkeit zu erledigen.

Wir fügen folgende VM-Argumente in der Launch-Konfiguration hinzu; es sind dieselben, die wir zuvor in die eclipse.ini eingetragen haben:

-Dosgi.framework.extensions=org.eclipse.fx.osgi
-Defxclipse.java-modules.dir=C:\Program
Files\Java\javafx-sdk-11.0.2\lib

Gegebenenfalls kann man sich die Sourcen (https://github.com/eclipse/gef.git) des GEF-Frameworks in den Workspace laden und die oben genannten Punkte direkt ausprobieren. Weitere Informationen zur GEF-Entwicklung finden sich auf der Seite mit der Entwicklerdoku: https://github.com/eclipse/gef/wiki#developer-documentation.

Fazit

Mit der oben beschriebenen Vorgehensweise sollte der Umstieg bestehender Eclipse-Anwendungen auf OpenJDK 11 und OpenJFX 11 mit e(fx)clipse gelingen.

Gibt es Anmerkungen oder Fragen zu dieser Vorgehensweise?
Wir freuen uns über jegliche Art der Rückmeldung.

Comments