web-dev-qa-db-de.com

So stellen Sie eine JavaFX 11-Desktopanwendung mit einer JRE bereit

Ich habe eine JavaFX-Desktopanwendung (JDK 8), die Java Web Start für die Bereitstellung verwendet. Benutzer haben Java 8 installiert und gehen einfach auf die URL (eine öffentliche URL auf meinem AWS Linux-Server) und die Anwendung wird heruntergeladen/gestartet (mithilfe von Web Start). Ich kann die Anwendung auch leicht aktualisieren, indem ich neue JARs auf dem Server bereitstelle. Alles funktioniert gut.

Allerdings hat Oracle Web Start mit Java 11 eingestellt und in seinem Whitepaper „Java Client Roadmap Update“ vom März 2018 wird empfohlen, eine JRE mit der Anwendung zu bündeln („Die Vorstellung, dass eine Anwendung unabhängig von einer eigenständigen JRE verteilt wird) lautet: daher schnell verblassen. ”). Ich kann mich nicht darauf verlassen, dass meine Benutzer bei Java 8 für Web Start bleiben, und selbst wenn sie bei 8 bleiben, benötigt Oracle eine Lizenz, um Java 8 weiterhin verwenden zu können (was ich nicht habe, kann sehr kostspielig sein, und ich würde es vorziehen auf jeden Fall mit der Community auf JavaFX 11 und OpenJDK zuzugreifen).

Ich möchte zu JavaFX 11 migrieren. Ich habe OpenJFXs "Erste Schritte mit JavaFX11" ( https://openjfx.io/openjfx-docs/ ) mit OpenJDK 11.0.1 und JavaFX SDK 11.0.1 von Gluon verfolgt (auf Netbeans 10vc2), und konnten die Beispielanwendungen zum Laufen bringen (und mir scheint, ich sollte in der Lage sein, meinen JavaFX 8-Code leicht auf JavaFX 11 zu portieren).

Hier bin ich jedoch auf der Suche nach Richtung. Wie bündige ich dies mit der JRE und verteile es für meine Endbenutzer (und biete Anwendungsaktualisierungen an)? Gibt es einen einfachen Ausweg (oder sogar einen harten Weg mit einigen Anweisungen)? 

Ich kann hunderte von Stunden damit verbringen, ausdrucksstarke, umfassende und nützliche Desktop-Geschäftsanwendungen in JavaFX 11 zu schreiben, aber was mache ich dann? 

Sind die Deployment-Toolkits wie JWrapper, InstallAnywhere usw. für diese neue Ära von Java 11 geeignet? Hat Gluon/openjfx.io möglicherweise eine Empfehlung oder einen Leitfaden, den ich vermisst habe? Ich kann anscheinend keine Empfehlungen oder Anleitungen aus seriösen Quellen finden, wie Entwickler, die sich auf das Schreiben des Front-End-Codes konzentrieren, die Anwendungen bereitstellen.

Vielen Dank für jede Hilfe oder Anleitung.

8
mcs75

Jetzt funktioniert es so, dass Sie Ihr Programm in ein Modul umwandeln und es dann mit allen anderen benötigten Modulen "verknüpfen".

Das Ergebnis dieses Verknüpfungsvorgangs ist das, was als Bild bezeichnet wird. Ein Image ist eigentlich eine Dateibaumstruktur, die ein bin-Verzeichnis mit einer oder mehreren ausführbaren ausführbaren Dateien enthält. Dieser Baum ist das, was Sie verteilen, normalerweise als zip oder tar.gz.

Die Schritte sind:

  1. Erstellen Sie eine module-info.Java
  2. Kompilieren Sie mit einem Modulpfad anstelle eines Klassenpfads
  3. Erstellen Sie wie üblich ein Glas aus Klassen
  4. Konvertieren Sie jar mit dem Tool jmod des JDK in ein jmod
  5. Verknüpfen Sie das jmod und die Module, von denen es abhängt, mit einem Image

Einen Modul-Deskriptor schreiben

Der erste Schritt besteht darin, die Anwendung in ein Modul umzuwandeln. Zumindest erfordert dies das Erstellen eines module-info.Java oben in Ihrem Quellbaum (dh im leeren Paket). Jedes Modul hat einen Namen, der oft mit einem Paketnamen identisch ist, muss aber nicht sein. So könnte Ihre module-info.Java so aussehen:

module com.mcs75.businessapp {
    exports com.mcs75.desktop.businessapp;

    requires Java.logging;
    requires transitive javafx.graphics;
    requires transitive javafx.controls;
}

Gebäude

Beim Erstellen geben Sie überhaupt keinen Klassenpfad an. Stattdessen geben Sie einen Modulpfad an.

Ein Modulpfad ist eine Liste von Verzeichnissen, nicht Dateien. Jedes Verzeichnis enthält nicht überraschend Module. Das Verzeichnis jmods des JDK ist implizit enthalten. Sie müssen lediglich Verzeichnisse mit den von Ihnen benötigten Nicht-JDK-Modulen aufnehmen. In Ihrem Fall bedeutet das zumindest JavaFX von Gluon:

javac -Xlint -g -d build/classes --module-path /opt/gluon-javafx/lib \
    src/Java/com/mcs75/desktop/businessapp/*.Java

Dann erstellen Sie ein Glas auf die übliche Weise:

jar -c -f build/mybusinessapp.jar -C build/classes .

Eine JAR-Datei mit einer Modul-info.class wird als modulare JAR betrachtet.

Jmod erstellen

Das Erstellen eines Jmod ist normalerweise ein einfacher Prozess:

mkdir build/modules
jmod create --class-path build/mybusinessapp.jar \
    --main-class com.mcs75.desktop.businessapp.BuinessApplication \
    build/modules/mybusinessapp.jmod

Verlinkung

Schließlich verwenden Sie den Befehl jlink des JDK, um alles zusammenzubauen:

jlink --output build/image \
    --module-path build/modules:/opt/gluon-javafx/lib \
    --add-modules com.mcs75.businessapp \
    --launcher MyBusinessApp=com.mcs75.businessapp

jlink erstellt eine minimale JRE, die nur die Module enthält, die Sie explizit hinzufügen (und die von diesen expliziten Modulen benötigten Module). --add-modules ist die erforderliche Option, die angibt, was hinzugefügt werden soll.

Wie bei anderen JDK-Tools gibt --module-path Verzeichnisse an, die Module enthalten.

Die --launcher-Option bewirkt, dass der endgültige Bildbaum ein zusätzliches ausführbares Skript in seinem bin-Verzeichnis mit dem angegebenen Namen (dem Teil vor den gleichwertigen) enthält. MyBusinessApp=com.mcs75.businessapp bedeutet also "eine ausführbare Datei namens MyBusinessApp erstellen, die das Modul com.mcs75.businessapp ausführt."

Da der jmod create-Befehl eine --main-class-Option enthält, weiß Java genau, was ausgeführt werden soll, genauso wie das Definieren eines Hauptklassenattributs in einem Manifest. Es ist auch möglich, eine Klasse explizit für die Ausführung in der Option --launcher zu deklarieren, falls dies gewünscht wird.

Verteilen

Was Sie verteilen möchten, ist eine ZIP- oder tar.gz-Datei des gesamten Bilddateibaums. Die ausführbare Datei, die der Benutzer ausführen soll, befindet sich im Verzeichnis bin des Images. Natürlich können Sie Ihre eigenen ausführbaren Dateien hinzufügen. Sie können dies auch in jedem Installer ablegen, solange die Struktur des Image-Baums erhalten bleibt.

Ein zukünftiges JDK wird über ein Packaging-Tool für die Erstellung vollwertiger nativer Installer verfügen.

Überbauend

Da das Image native Binärdateien enthält, müssen Sie für jede Plattform ein Image erstellen. Offensichtlich besteht eine Möglichkeit darin, das Image auf einem Linux-System und erneut auf einem Windows-System und erneut auf einem Mac usw. zu erstellen.

Sie können jedoch auch jmod und jlink verwenden, um Images für andere Plattformen zu erstellen, unabhängig davon, wo Sie bauen.

Es sind nur wenige zusätzliche Schritte erforderlich. Zunächst benötigen Sie die JDKs für diese anderen Plattformen. Laden Sie sie als Archiv (Zip oder tar.gz) herunter, nicht als Installationsprogramm, und entpacken Sie sie in Verzeichnisse Ihrer Wahl.

Jedes JDK definiert eine platform - Zeichenfolge. Dies hat normalerweise die Form <os> - <Arch>. Die Plattform ist eine Eigenschaft des Java.base-Moduls. Sie können jede JDK-Plattform sehen, indem Sie dieses Modul untersuchen:

jmod describe path-to-foreign-jdk/jmods/Java.base.jmod | grep '^platform'

Übergeben Sie diese Plattformzeichenfolge mit der Option --target-platform an Ihren jmod-Befehl:

mkdir build/modules
jmod create --target-platform windows-AMD64 \
    --class-path build/mybusinessapp.jar \
    --main-class com.mcs75.desktop.businessapp.BuinessApplication \
    build/modules/mybusinessapp.jmod

Schließlich möchten Sie beim Verknüpfen explizit das jmods-Verzeichnis der anderen JDK einschließen, sodass jlink nicht unbedingt seine eigenen JDK-Module enthält:

jlink --output build/image \
    --module-path path-to-foreign-jdk/jmods:build/modules:/opt/gluon-javafx/lib \
    --add-modules com.mcs75.businessapp \
    --launcher MyBusinessApp=com.mcs75.businessapp
7
VGR

José: Ich sehe, wir haben das gleiche Problem zu lösen (siehe meine Frage unter Eigenes Anwendungs-Packaging für eine JavaFX-App unter Windows: InnoSetup OR javafxpackager? ). Vielleicht wäre die Verwendung des Javapackagers eines JDK trotz der zahlreichen Parameter eine "einfache" Lösung. In meinem Fall ist es mir gelungen, mit diesem Tool ein "eigenständiges Anwendungs-Packaging für eine JavaFX-App unter Windows" zu generieren.

0
Pascal DUTOIT