web-dev-qa-db-fra.com

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

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

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.

11
José Pereda

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.

0
Searjasub