[OpenJDK11 & JavaFX13] Créez une application javaFX avec IntelliJ + gradle et créez un package qui peut être distribué avec un JRE léger.

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.

environnement

$ 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

Sélection JDK

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

procédure

Créer un projet Gradle avec IntelliJ

Créez un nouveau projet Gradle dans IntelliJ.

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

Ajout de paramètres pour javafx à build.gradle

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'
    }
}

Créer une classe JavaFx pour les tests

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. Screenshot from 2019-10-01 16-43-52.png

build pour créer un fichier JAR exécutable

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éé. Screenshot from 2019-10-01 16-47-08.png

Si vous essayez d'exécuter le fichier jar dans cet état ... Screenshot from 2019-10-01 16-48-17.png

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.

Créer un JRE léger

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/ Screenshot from 2019-10-01 16-54-31.png

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. Screenshot from 2019-10-01 16-56-53.png

Cette fois, il semble bon d'utiliser les modules suivants. -Java.lang-> java-base -Java.application-> javafx.base -Javafx.stage-> javafx.controls

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/javaLe binaire a également été créé.

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

Exécutez le fichier JAR à l'aide du JRE 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 

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

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

Je vous remercie pour votre travail acharné!

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

[OpenJDK11 & JavaFX13] Créez une application javaFX avec IntelliJ + gradle et créez un package qui peut être distribué avec un JRE léger.
Créer un contrôle de page qui peut être utilisé avec RecyclerView
Créez un fichier jar qui peut être exécuté sur Gradle
Outils d'analyse des performances et de diagnostic des pannes utilisables avec OpenJDK
Créer une JVM pour la distribution d'applications avec les modules JDK 9 et jlink
Construire un projet Java avec Gradle
Implémentation de machine à sous simple qui peut être utilisée avec copie
[Rails] "Pry-rails" qui peuvent être utilisés lors de l'enregistrement avec la méthode create
Exécutable serveur avec Spring gradle Comment créer JAR et WAR