[OpenJDK11 & JavaFX13] Erstellen Sie eine JavaFX-App mit IntelliJ + gradle und erstellen Sie ein Paket, das zusammen mit einer leichten JRE verteilt werden kann.

Ich wollte eine JavaFX-App erstellen, die verteilt werden kann, aber da ich einen Versuch und Irrtum gemacht habe, werde ich sie hier zusammenfassen.

Umgebung

$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

※macOS Mojave(10.14.6)Aber ich konnte es nach dem gleichen Verfahren erstellen.

$ java --version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3, mixed mode, sharing)

$ jlink --version
11.0.4

JDK-Auswahl

Zuerst dachte ich daran, ein JDK wie Amazon Corretto zu verwenden, das mit JavaFX geliefert wird. Nachdem ich den folgenden Artikel gelesen hatte, entschied ich mich jedoch, diesmal Openjdk-11, JavaFX als Bibliothek, zu verwenden und zum Zeitpunkt der Verteilung eine einfache JRE zu generieren. Auswählen eines JDK in der OpenJFX-Ära oder Verteilen von Anwendungen in der OpenJFX-Ära

Verfahren

Erstellen Sie mit IntelliJ ein Gradle-Projekt

Erstellen Sie ein neues Gradle-Projekt in IntelliJ.

Screenshot from 2019-10-01 16-05-10.png

Einstellungen für javafx zu build.gradle hinzugefügt

Erstellen Sie build.gradle unter Bezugnahme auf die folgende Quelle, die auf der offiziellen OpenJFX-Website beschrieben ist. https://github.com/openjfx/samples/blob/master/IDE/IntelliJ/Modular/Gradle/hellofx/build.gradle

Da in den IntelliJ-Einstellungen "Dieses Projekt bei Änderungen in Build-Skriptdateien automatisch importieren" aktiviert ist, wird das Modul außerdem importiert.

build.gradle


plugins {
    id 'java'
    id "org.openjfx.javafxplugin" version "0.0.8" //hinzufügen
}

group 'com.example'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

//hinzufügen
javafx {
    version = "13"
    modules = [ 'javafx.controls', 'javafx.fxml' ]
}

//Geben Sie beim Erstellen eines ausführbaren Jar die Hauptklasse an
jar {
    manifest {
        attributes 'Main-Class': 'Main'
    }
}

Erstellen Sie eine JavaFx-Klasse zum Testen

Main.java


import javafx.application.Application;

public class Main {
    public static void main(String... args){
        Application.launch(MyApplication.class);
    }
}

MyApplication.java


import javafx.application.Application;
import javafx.stage.Stage;

public class MyApplication extends Application {
    public MyApplication(){
        super();
    }

    @Override
    public void start(Stage primaryStage) throws Exception{
        primaryStage.setTitle("Hello");
        primaryStage.setWidth(300);
        primaryStage.setHeight(200);
        primaryStage.show();
    }
}

Als Ergebnis davon wird der folgende Bildschirm angezeigt. Screenshot from 2019-10-01 16-43-52.png

Erstellen, um eine ausführbare JAR-Datei zu erstellen

Führen Sie in der Konsole `` `gradle build``` aus. Wenn es kein Problem gibt, denke ich, dass eine ausführbare JAR-Datei erstellt wird. Screenshot from 2019-10-01 16-47-08.png

Wenn Sie versuchen, die JAR-Datei in diesem Zustand auszuführen ... Screenshot from 2019-10-01 16-48-17.png

Wie Sie sehen können, ärgere ich mich, dass die Klasse javafx.application.Application fehlt. Dies liegt daran, dass im jre von openjdk-11.0.4 kein JavaFX-Modul vorhanden ist.

Erstellen Sie eine leichte JRE

Verwenden wir jetzt jlink, um ein leichtes jre zu erstellen, damit diese JAR-Datei funktioniert! Dieses Mal habe ich auf den folgenden Artikel verwiesen. So erstellen Sie eine einfache JRE für die Verteilung

Laden Sie zunächst jmods von Downloads auf der folgenden Seite herunter. https://openjfx.io/ Screenshot from 2019-10-01 16-54-31.png

Extrahieren Sie die heruntergeladene Zip-Datei und platzieren Sie sie in einem geeigneten Pfad. (Dieses Mal befindet es sich in `` `/ usr / lib / jvm / javafx-13-openjfx / javafx-jmods-13```.)

Dieses Mal habe ich jmods für Linux heruntergeladen.

Verwenden Sie als Nächstes den Befehl `jdeps $ {jar file path}`, um die Module zu überprüfen, die zum Ausführen dieser JAR-Datei erforderlich sind. Screenshot from 2019-10-01 16-56-53.png

Dieses Mal scheint es gut, die folgenden Module zu verwenden. -Java.lang-> Java-Basis -Java.application-> javafx.base -Javafx.stage-> javafx.controls

Nachdem wir die benötigten Module kennen, erstellen wir ein leichtes jre. Ich konnte es erstellen, indem ich das obige Modul mit dem folgenden Befehl jlink angab.

$ jlink --compress=2 --module-path /usr/lib/jvm/java-11-openjdk-amd64/jmods:/usr/lib/jvm/javafx-13-openjfx/javafx-jmods-13 --add-modules java.base,javafx.base,javafx.controls --output jre

Im aktuellen Pfad wurde ein jre-Verzeichnis erstellt. jre/bin/javaBinär wurde ebenfalls erstellt.

Screenshot from 2019-10-01 17-23-21.png

Führen Sie die JAR-Datei mit der erstellten JRE aus.

Lassen Sie uns nun das Programm mit dem zuletzt erstellten jre ausführen.

$ ./jre/bin/java -jar build/libs/javafx-sample-1.0-SNAPSHOT.jar 

Screenshot from 2019-10-01 17-30-28.png

Ich konnte es sicher ausführen!

Kombinieren Sie danach die JAR-Datei und jre in einem netten Verzeichnis, erstellen Sie eine Shell- oder Bat-Datei zur Ausführung oder kombinieren Sie sie zu einem App-Paket, und fertig. (Das Folgende ist ein Beispiel für das Erstellen einer Shell, indem Sie sie in einen Ordner legen.)

$ ls
javafx-sample-1.0-SNAPSHOT.jar  jre  start.sh

$ cat start.sh
#!/bin/sh
BASE=$(cd $(dirname $0); pwd)
$BASE/jre/bin/java -jar $BASE/javafx-sample-1.0-SNAPSHOT.jar

## sh start.Kann mit sh ausgeführt werden

Danke für deine harte Arbeit!

Zum ersten Mal habe ich eine einfache JRE mit Befehlen wie jlink und jdeps erstellt, aber ich denke, diese Methode ist einfach, wenn Sie eine JavaFX-App erstellen, die unabhängig von der Benutzerumgebung (jdk usw.) ausgeführt werden kann. Die Größe des jre-Verzeichnisses beträgt diesmal 368,3 MB, daher frage ich mich, ob es schwerer sein wird, wenn ich mehr tun kann.

das ist alles. Vielen Dank!

Recommended Posts

[OpenJDK11 & JavaFX13] Erstellen Sie eine JavaFX-App mit IntelliJ + gradle und erstellen Sie ein Paket, das zusammen mit einer leichten JRE verteilt werden kann.
Erstellen Sie ein Seitensteuerelement, das mit RecyclerView verwendet werden kann
Erstellen Sie eine JAR-Datei, die auf Gradle ausgeführt werden kann
Tools zur Leistungsanalyse und Fehlerdiagnose, die mit OpenJDK verwendet werden können
Erstellen Sie eine JVM für die App-Verteilung mit JDK 9-Modulen und jlink
Erstellen eines Java-Projekts mit Gradle
Einfache Implementierung eines Spielautomaten, die mit Kopie verwendet werden kann
[Rails] "Pry-Rails", die beim Speichern mit der create-Methode verwendet werden können
Server mit Spring Gradle ausführbar So erstellen Sie JAR und WAR