web-dev-qa-db-fra.com

Java11/JavaFX et Maven ne fonctionneront pas en dehors de NetBeans IDE 9

Selon bibliothèque de déploiement JavaFX introuvable dans le JDK actif

J'ai utilisé l'approche José Pereda Maven et cela fonctionne bien dans NetBeans, mais dès que j'essaie de l'exécuter à l'extérieur avec "Java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar", l'erreur suivante apparaît 
"Erreur: les composants d'exécution JavaFX sont manquants et sont nécessaires pour exécuter cette application" 
Le "md.mavenproject1.MainApp" est juste un nom temporaire pendant que j'essaie de comprendre cela.
Mon fichier pom ressemble à:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>md</groupId>
    <artifactId>mavenproject1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>mavenproject1</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <mainClass>md.mavenproject1.MainApp</mainClass>
    </properties>

    <organization>
        <!-- Used as the 'Vendor' for JNLP generation -->
        <name>Your Organisation</name>
    </organization>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>11-ea+25</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>11-ea+25</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.ow2.asm</groupId>
                        <artifactId>asm</artifactId>
                        <version>6.1.1</version>
                        <!--  Use newer version of ASM  -->
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>Java</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <mainClass>md.mavenproject1.MainApp</mainClass>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-Assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>md.mavenproject1.MainApp</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin> 
        </plugins>
    </build>
</project>

Et mon fichier nbactions.xml ressemble à:

<?xml version="1.0" encoding="UTF-8"?>
<actions>
        <action>
            <actionName>run</actionName>
            <goals>
                <goal>clean</goal>
                <goal>package</goal>
                <goal>org.codehaus.mojo:exec-maven-plugin:1.2.1:Java</goal>
            </goals>
            <properties>
                <runfx.args>-jar "${project.build.directory}/${project.build.finalName}.jar"</runfx.args>
            </properties>
        </action>
        <action>
            <actionName>debug</actionName>
            <goals>
                <goal>clean</goal>
                <goal>package</goal>
                <goal>org.codehaus.mojo:exec-maven-plugin:1.2.1:Java</goal>
            </goals>
            <properties>
                <runfx.args>-Xdebug -Xrunjdwp:transport=dt_socket,server=n,address=${jpda.address} -Dglass.disableGrab=true -jar "${project.build.directory}/${project.build.finalName}.jar"</runfx.args>
                <jpda.listen>true</jpda.listen>
            </properties>
        </action>        
    </actions>

Toute aide que vous pourrez me fournir sera d’une grande utilité, car j’envisage de passer de l’enfance à la programmation dans le secondaire avec le changement de JavaFX, mais ils voudront pouvoir emporter leurs programmes chez eux. J'utilise OpenJDK 11 sur mon système .
**modifier **
J'ai changé la ligne pour exécuter le programme en: 

Java --module-path c:\javafx-sdk-11\lib --add-modules javafx.controls -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar

et maintenant je reçois:

Exception in Application start method
Java.lang.reflect.InvocationTargetException
        at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
        at Java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.base/Java.lang.reflect.Method.invoke(Method.Java:566)
        at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.Java:464)
        at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.Java:363)
        at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
        at Java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.base/Java.lang.reflect.Method.invoke(Method.Java:566)
        at Java.base/Sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.Java:1051)
Caused by: Java.lang.RuntimeException: Exception in Application start method
        at javafx.graphics/com.Sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.Java:900)
        at javafx.graphics/com.Sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.Java:195)
        at Java.base/Java.lang.Thread.run(Thread.Java:834)
Caused by: Java.lang.IllegalAccessError: class com.Sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x11a24f71) cannot access class com.Sun.javafx.util.Utils (in module javafx.graphics) because module javafx.graphics does not export com.Sun.javafx.util to unnamed module @0x11a24f71
        at com.Sun.javafx.fxml.FXMLLoaderHelper.<clinit>(FXMLLoaderHelper.Java:38)
        at javafx.fxml.FXMLLoader.<clinit>(FXMLLoader.Java:2056)
        at md.test33.MainApp.start(MainApp.Java:15)
        at javafx.graphics/com.Sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.Java:846)
        at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.Java:455)
        at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.Java:428)
        at Java.base/Java.security.AccessController.doPrivileged(Native Method)
        at javafx.graphics/com.Sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.Java:427)
        at javafx.graphics/com.Sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.Java:96)
        at javafx.graphics/com.Sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at javafx.graphics/com.Sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.Java:174)
        ... 1 more
Exception running application md.mavenproject1.MainApp

Je pensais qu'en utilisant les dépendances de maven, je n'aurais pas besoin d'utiliser le jdk local. Toute aide que quiconque pourrait donner serait vraiment utile. Si je supprime les dépendances et utilise Oracle Java 10 jdk, le programme et l’exécution en dehors de Netbeans mais avec Java 11, il ne fonctionne que dans. S'il vous plaît aider .

** MODIFIER ** 

En modifiant le fichier pom et en supprimant:

 <plugin>
                <artifactId>maven-Assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>md.mavenproject1.MainApp</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin> 

et au lieu d'utiliser:

  <!--  Used to make dependencys needed to run the program -->  
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- makes the JAR file to run the program outside -->
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>           
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>${mainClass}</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

Je pouvais maintenant modifier la ligne de démarrage pour utiliser la bibliothèque JavaFX jointe que j'avais ajoutée au lieu d'utiliser le SDK que j'avais téléchargé.

Java --module-path lib --add-modules javafx.controls --add-exports=javafx.graphics/com.Sun.javafx.util=ALL-UNNAMED --add-exports=javafx.base/com.Sun.javafx.reflect=ALL-UNNAMED --add-exports=javafx.base/com.Sun.javafx.beans=ALL-UNNAMED --add-exports=javafx.graphics/com.Sun.glass.utils=ALL-UNNAMED --add-exports=javafx.graphics/com.Sun.javafx.tk=ALL-UNNAMED -jar mavenproject1-1.0-SNAPSHOT.jar

Je voudrais faire inclure le jre au lieu d'utiliser le local. Si quelqu'un a une idée de ce que ce serait génial.

14
Mathew Dusome

Une façon de résoudre ce problème consiste à ajouter les arguments suivants à la ligne de commande

--add-exports=javafx.graphics/com.Sun.javafx.util=ALL-UNNAMED
13
nullpointer

J'ai un problème similaire lors de la création du projet javafx hello world par défaut dans IntelliJ IDEA avec openjdk 11 et openjfx 11. Le travail à effectuer consiste à utiliser la CLI proposée dans la configuration du projet.

 enter image description here

Mais dans ce cas, la solution est une sorte de bidouille au lieu d’un correctif de configuration approprié… .. Mon problème était que je n’avais aucun module-info.Java pour initialiser le module de plate-forme Java approprié. Par conséquent, le module IntelliJ est en fait le module unnamed. Après avoir créé le descripteur de module approprié, le projet n’est plus un module de plate-forme non nommé.

Le problème suivant que j’ai eu est lié à l’utilisation du module de plate-forme Java externe en tant que fichier jar (les bibliothèques openjfx doivent être spécifiques). Ceci doit être résolu en ajoutant libraries dans les paramètres de la structure du projet.

 enter image description here

Et puis cela fonctionnera sans aucun argument CLI supplémentaire.

1
domino