JavaFX et maven: NullPointerException: Emplacement est nécessaire
J'ai essayé d'obtenir Maven mis en place avec JavaFX. Même si j'étais inexpérimenté avec Maven et JavaFX, je ne m'attendais pas à être si beaucoup d'un défi. Mon Java est assez solide (y compris Swing), et ne s'attendait pas à autant de difficulté à obtenir mis en place.
J'ai commencé avec un JavaFX projet fourni par IntelliJ 13.0 Community Edition. Le code dans ma classe Principale est relativement faible:
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application
{
@Override
public void start(Stage primaryStage) throws Exception
{
//getClass().getResource("../../resources/sample.fxml");
Parent root = FXMLLoader.load(getClass().getResource("../sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 300, 275));
primaryStage.show();
}
public static void main(String[] args)
{
launch(args);
}
}
et mon pom.xml
n'est pas trop grande, soit:
<?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>sample</groupId>
<artifactId>JavaFXDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<organization>
<name>RubberDucky</name>
</organization>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.zenjava</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>2.0</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>com.zenjava</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>2.0</version>
<configuration>
<mainClass>sample.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>javafx</artifactId>
<version>2.2</version>
<systemPath>${java.home}/lib/jfxrt.jar</systemPath>
<scope>system</scope>
</dependency>
</dependencies>
</project>
Je suis en utilisant le JavaFX Plugin Maven pour construire l'application. Après l'exécution de mvn clean jfx:jar
tout semble aller bien, toutes les versions de réussir. Mais quand j'essaye d'exécuter l'application, j'obtiens l'erreur suivante:
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.javafx.main.Main.launchApp(Main.java:698)
at com.javafx.main.Main.main(Main.java:871)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown So
urce)
at com.sun.javafx.application.LauncherImpl.access$000(Unknown Source)
at com.sun.javafx.application.LauncherImpl$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at sample.Main.start(Main.java:15)
at com.sun.javafx.application.LauncherImpl$5.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl$5.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl$4$1.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl$4$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl$4.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source)
at com.sun.glass.ui.win.WinApplication$3$1.run(Unknown Source)
... 1 more
Après un rude débogage le problème semble être dans le chemin que je suis le chargement de mes fichiers de. Après coder en dur les sample.fxml
à une place sur mon disque dur, l'application s'exécute sans problème. En va de même pour la configuration actuelle (voir ci-dessus) lors de l'exécution de l'application à partir de l'Ide.
J'ai l'impression d'avoir épuisé toutes les ressources (y compris StackOverflow, quelques erreurs similaires), mais je ne peux pas comprendre ce qui est exactement le problème.
getClass().getResource("../sample.fxml")
est null. Peut-être essayergetClass().getResource("resources/sample.fxml")
ougetClass().getResource("/resources/sample.fxml")
?getClass().getResource("../sample.fxml")
travaille dans le débogueur, pas dans Maven. J'ai essayé de vos suggestions, mais ne travaillent pas et je ne peux pas comprendre ce qui le ferait.
Vous devez vous connecter pour publier un commentaire.
Assurez-vous que votre
sample.fxml
est dans lesrc/main/resources/
répertoire (ou un sous-répertoire). Ensuite, vous pouvez accéder au fichier comme ceci:Explication:
Au cours de la phase de compilation de toutes les ressources et les classes copiés sur
target/classes/
. Si votre fichier fxml réside dans ce répertoire et votre classe dans un sous-répertoire au sujet de son nom de package. Si vous appelezgetClass().getResource("sample.fxml");
le fichier sera recherché par rapport à la classe fichier de ce répertoire:target/classes/sample/
.Appel
.getResource()
sur le chargeur de classe définit la relative chemin de recherche detarget/classes/
et, par conséquent, votre fichier est trouvé.P. S. Vous pouvez également écrire:
Comme @Absurde-Esprit déjà expliqué, maven sera pas la copie de fichiers de ressources (comme le fxml) qui se trouve sous la
src
répertoire.Si vous voulez garder la
fxml
fichiers outre les fichiers source java, vous pouvez utiliser le maven plugin de ressource pour les copier:J'ai eu le même problème avec Intelij et Gradle.
Étapes pour résoudre:
1.Déplacez le fichier
chemin
Pour ceux qui utilisent gradle que leur système de construction de l'ajouter à votre
build.gradle
fichier:Puis nettoyer et reconstruire votre projet.
Alors, que faut-il faire? Si vous avez un
view.fxml
à l'intérieur de votrecom.example.myfxapp
paquet, après la construction de votre projet, il sera exporté vers<build dir>/resources/com/example/myfxapp/view.fxml
Pour moi, j'avais pris soin des choses suivantes -
Assurez-vous que fxml fichier est placé là où votre classe principale réside. Et puis la charger à l'aide de ce (Dans mon cas, TechJFX.fxml est le fichier)
Ajouter opencv-*.jar dans votre dossier de projet (Dans mon cas opencv-300.jar)
Ajouter le bocal pour le chemin de génération à l'aide de
Clic droit sur le dossier du projet -> Build Path -> Configure Build Path -> Onglet Bibliothèques -> Add External JARS et de localiser le pot
Également, en vertu de l'Ordonnance et de l'Exportation -> Tique opencv-300.jar et JRE System Library(si ce n'est déjà cochée)
Copie opencv_java*.dll (Dans mon cas opencv_java300.dll) à l'endroit même où vous jar est dans le dossier du projet.
Ajoutez la méthode suivante à votre classe principale
Fait.
Espère que cela aide quelqu'un en face de problème similaire.