Ich wollte eine JavaFX-App erstellen, die verteilt werden kann, aber da ich einen Versuch und Irrtum gemacht habe, werde ich sie hier zusammenfassen.
$ 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
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
Erstellen Sie ein neues Gradle-Projekt in IntelliJ.
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'
}
}
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.
Führen Sie in der Konsole `` `gradle build``` aus. Wenn es kein Problem gibt, denke ich, dass eine ausführbare JAR-Datei erstellt wird.
Wenn Sie versuchen, die JAR-Datei in diesem Zustand auszuführen ...
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.
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/
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.
Dieses Mal scheint es gut, die folgenden Module zu verwenden. -Java.lang-> Java-Basis -Java.application-> javafx.base -Javafx.stage-> javafx.controls
`jdeps --list-deps $ {jar file path}`
festlegen, scheinen Sie zu wissen, welches Modul Sie verwenden sollen, aber aus irgendeinem Grund kann diese Option nicht verwendet werden ...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/java
Binär wurde ebenfalls erstellt.
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
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
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