Exécution d'un exemple javafx sur JDK 11 avec les JMODS OpenJFX 11 sur le chemin du module


J'ai téléchargé les fichiers Jmod JavaFX du projet OpenJFX et les ai placés dans le répertoire G:\openjfx\javafx-jmods-11. J'utilise OpenJDK 11 qui n'a pas de jmod JavaFX dans JAVA_HOME/jmods, c'est-à-dire qu'il ne vient pas avec la distribution JavaFX.

Fichier d'informations du module:

module gui{
    requires javafx.graphics;
    requires javafx.controls;

    exports com.test;
}

Je compile avec ce qui suit:

javac -p G:\openjfx\javafx-jmods-11 -d mods --module-source-path src 
    src\gui\com\test\*.java src\gui\module-info.java

La compilation réussit. Mais je ne peux pas exécuter le code compilé en utilisant la commande ci-dessous:

java -p G:\openjfx\javafx-jmods-11;mods -m gui/com.test.CreateGuiDemo

, Mais j'obtiens l'erreur ci-dessous:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.graphics not found, required by gui
Author: José Pereda, 2018-08-14

1 answers

Je crois qu'il y a une explication à l'erreur que vous rencontrez: les jmods ne peuvent pas être utilisés au moment de l'exécution.

Ceci est expliqué ici: http://openjdk.java.net/jeps/261#Packaging:-JMOD-files:

Les fichiers JMOD peuvent être utilisés au moment de la compilation et du lien, mais pas au moment de l'exécution. Pour les prendre en charge au moment de l'exécution, il faudrait, en général, que nous soyons prêts à extraire et à lier des bibliothèques de code natif à la volée.

Et le crédit va à ceci réponse.

J'ai donc fait un module simple hellofx:

module hellofx {
    requires javafx.controls;

    exports hellofx;
}

Avec HelloFX échantillon de ici et téléchargé le jmods JavaFX 11 pour ma plate-forme à partir de ici. J'ai également téléchargé le SDK JavaFX 11 (jars) à partir du même emplacement.

Le temps de Compilation

Au moment de la compilation, nous pouvons faire, avec jmods:

javac -p /path-to/javafx-jmods-11/ -d mods/hellofx $(find src/hellofx -name "*.java")

Ou avec SDK:

javac -p /path-to/javafx-sdk-11/lib -d mods/hellofx $(find src/hellofx -name "*.java")    

Dans les deux cas, le résultat est exactement le même, comme prévu: Natif les bibliothèques ne sont pas requises pendant la compilation.

Moment de l'Exécution

Maintenant, nous voulons exécuter notre petit module.

Avec jmods, comme indiqué par l'OP, en cours d'exécution:

java -p /path-to/javafx-jmods-11/:mods -m hellofx/hellofx.HelloFX   

Échoue avec:

Error occurred during initialization of boot layer
  java.lang.module.FindException: Module javafx.controls not found, required by hellofx

Mais en utilisant le SDK, fonctionne:

java -p /path-to/javafx-sdk-11/lib/:mods -m hellofx/hellofx.HelloFX

Temps de liaison

Comme indiqué par le JEP-261, les jmods fonctionnent également au moment du lien, nous pouvons donc utiliser l'outil jlink entre la compilation et l'exécution.

, Vous pouvez utiliser l'outil jlink pour assembler et optimiser un ensemble de modules et leurs dépendances dans une image d'exécution personnalisée. (source)

Alors faisons:

jlink -p /path-to/javafx-jmods-11/:mods --add-modules=hellofx --output links

Qui va générer un dossier avec 90,7 Mo (sur mon Mac). Notez que le dossier lib contient toutes les bibliothèques natives requises de Java 11 et de JavaFX 11, ainsi qu'un fichier de 70,5 Mo nommé modules.

Moment de l'Exécution (2)

Et nous pouvons enfin faire:

links/bin/java -m hellofx/hellofx.HelloFX

Et cela fonctionnera.

Dans conclusion, si nous voulons utiliser uniquement des jmods pour compiler et exécuter nos modules, nous devons donner une étape supplémentaire avec jlink. Sinon, pour l'exécution, nous aurons besoin du SDK JavaFX.

 0
Author: José Pereda, 2018-10-05 21:25:04