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
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.