J'ai téléchargé les fichiers JavaFX Jmod 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'information 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 parviens pas à exécuter le code compilé à l'aide de la commande ci-dessous:
Java -p G:\openjfx\javafx-jmods-11;mods -m gui/com.test.CreateGuiDemo
Mais je reçois l'erreur ci-dessous:
Error occurred during initialization of boot layer
Java.lang.module.FindException: Module javafx.graphics not found, required by gui
Je crois qu’il existe une explication à l’erreur à laquelle vous faites face: jmods ne peut pas être utilisé 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 de la liaison, 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 être prêt à extraire et à relier les bibliothèques de code natif à la volée.
et le crédit va à cette réponse .
J'ai donc fait un module simple hellofx
:
module hellofx {
requires javafx.controls;
exports hellofx;
}
avec l'exemple HelloFX
de ici et j'ai téléchargé les jmods pour JavaFX 11 pour ma plate-forme de ici . J'ai également téléchargé le SDK JavaFX 11 (fichiers JAR) à partir du même emplacement.
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 que prévu: les bibliothèques natives ne sont pas nécessaires pendant la compilation.
Durée
Maintenant, nous voulons exécuter notre petit module.
Avec jmods, comme indiqué par le PO, exécutez:
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, ça marche:
Java -p /path-to/javafx-sdk-11/lib/:mods -m hellofx/hellofx.HelloFX
Temps de liaison
Comme indiqué dans le PEC-261, jmods fonctionne également au moment de la liaison. Nous pouvons donc utiliser l'outil jlink
entre le moment de la compilation et celui de 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. ( la source )
Alors faisons:
jlink -p /path-to/javafx-jmods-11/:mods --add-modules=hellofx --output links
cela 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 JavaFX 11, ainsi qu'un fichier de 70,5 Mo nommé modules
.
Durée d'exécution (2)
Et on peut enfin faire:
links/bin/Java -m hellofx/hellofx.HelloFX
Et ça va marcher.
En conclusion, si nous voulons utiliser uniquement 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.
Si ce n'est pas ajouté automatiquement, essayez d'utiliser cette configuration dans le fichier pom.xml. Assurez-vous de changer le "!! VOTRE NOM DE CLASSE PRINCIPAL ICI !!" vers le bas du code au nom de votre classe avec la méthode principale! Si ma classe est Example.Java, je souhaite y insérer simplement Example.
<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>Java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>!!YOUR MAIN CLASSNAME HERE!!</mainClass>
</configuration>
</plugin>
</plugins>
</build>
JavaFX n'est pas automatiquement ajouté en tant que dépendance avec Java 11. C'est pourquoi nous avons besoin d'ajouter manuellement.