Je voulais créer une application JavaFX qui puisse être distribuée, mais comme j'ai fait un essai et une erreur, je vais le résumer ici.
$ 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)Mais j'ai pu le créer par la même procédure.
$ 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
Au début, je pensais utiliser un JDK tel qu'Amazon Corretto livré avec JavaFX. Cependant, après avoir lu l'article suivant, j'ai décidé d'utiliser Openjdk-11 cette fois, JavaFX comme bibliothèque, et de générer un JRE léger au moment de la distribution. Sélection d'un JDK à l'ère d'OpenJFX ou distribution d'applications à l'ère d'OpenJFX
Créez un nouveau projet Gradle dans IntelliJ.
Créez build.gradle en vous référant à la source suivante décrite dans Site officiel d'OpenJFX. https://github.com/openjfx/samples/blob/master/IDE/IntelliJ/Modular/Gradle/hellofx/build.gradle
De plus, puisque «Importer automatiquement ce projet sur les modifications des fichiers de script de construction» est coché dans les paramètres IntelliJ, le module sera importé.
build.gradle
plugins {
id 'java'
id "org.openjfx.javafxplugin" version "0.0.8" //ajouter à
}
group 'com.example'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
//ajouter à
javafx {
version = "13"
modules = [ 'javafx.controls', 'javafx.fxml' ]
}
//Spécifiez la classe Main lors de la création d'un fichier Jar exécutable
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();
}
}
À la suite de cette exécution, l'écran suivant apparaîtra.
Dans la console, exécutez
gradle build```.
S'il n'y a pas de problème, je pense qu'un fichier jar exécutable sera créé.
Si vous essayez d'exécuter le fichier jar dans cet état ...
Comme vous pouvez le voir, je me fâche que la classe javafx.application.Application soit manquante. C'est parce qu'il n'y a pas de module JavaFX dans le jre d'openjdk-11.0.4.
Utilisons maintenant jlink pour créer un jre léger pour faire fonctionner ce fichier jar! Cette fois, je me suis référé à l'article suivant. Comment créer un JRE léger pour la distribution
Tout d'abord, téléchargez jmods à partir de Téléchargements sur la page suivante. https://openjfx.io/
Extrayez le fichier zip téléchargé et placez-le dans un chemin approprié.
(Cette fois, il est placé dans
/ usr / lib / jvm / javafx-13-openjfx / javafx-jmods-13 ''.)
Cette fois, j'ai téléchargé jmods pour Linux.
Ensuite, utilisez la commande
jdeps $ {chemin du fichier jar}
pour vérifier les modules requis pour exécuter ce fichier jar.
Cette fois, il semble bon d'utiliser les modules suivants. -Java.lang-> java-base -Java.application-> javafx.base -Javafx.stage-> javafx.controls
jdeps --list-deps $ {chemin du fichier jar}
, il semble que vous savez quel module utiliser, mais pour une raison quelconque, cette option ne peut pas être utilisée ...Maintenant que nous connaissons les modules dont nous avons besoin, créons un fichier jre léger. J'ai pu le créer en spécifiant le module ci-dessus avec la commande jlink suivante.
$ 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
Un répertoire jre a été créé dans le chemin actuel.
jre/bin/java
Le binaire a également été créé.
Maintenant, exécutons le programme en utilisant le jre créé en dernier.
$ ./jre/bin/java -jar build/libs/javafx-sample-1.0-SNAPSHOT.jar
J'ai pu l'exécuter en toute sécurité!
Après cela, combinez le fichier JAR et jre dans un joli répertoire, créez un fichier shell ou bat pour l'exécution, ou combinez-les dans un package d'application, et vous avez terminé. (Ce qui suit est un exemple de création d'un shell en le plaçant dans un dossier)
$ 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.Peut être exécuté avec sh
Pour la première fois, j'ai créé un JRE léger à l'aide de commandes telles que jlink et jdeps, mais je pense que cette méthode est facile lors de la création d'une application JavaFX qui peut être exécutée indépendamment de l'environnement de l'utilisateur (jdk, etc.). La taille du répertoire jre cette fois-ci est de 368,3 Mo, donc je me demande si ce sera plus lourd si je peux faire plus.
c'est tout. Merci beaucoup!
Recommended Posts