JavaFX y maven: NullPointerException: la ubicación es obligatoria

He estado intentando configurar Maven con JavaFX. A pesar de que no tenía experiencia con Maven y JavaFX, no esperaba que fuera un gran desafío. Mi conocimiento de Java es bastante sólido (incluido Swing), y no esperaba tener tanta dificultad para configurarlo.

Comencé con un proyecto JavaFX provisto por IntelliJ 13.0 Community Edition. El código en mi clase principal es relativamente pequeño:

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); } } 

y mi pom.xml tampoco es demasiado grande:

   4.0.0 sample JavaFXDemo 1.0-SNAPSHOT jar  RubberDucky      com.zenjava javafx-maven-plugin 2.0      com.zenjava javafx-maven-plugin 2.0  sample.Main       com.oracle javafx 2.2 ${java.home}/lib/jfxrt.jar system    

Estoy usando JavaFX Maven Plugin para construir la aplicación. Después de ejecutar mvn clean jfx:jar todo parece estar bien, todas las comstackciones tienen éxito. Pero cuando bash ejecutar la aplicación, aparece el siguiente error:

 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 

Después de una depuración aproximada, el problema parece estar en la ruta de donde estoy cargando mis archivos. Después de codificar el sample.fxml en un lugar de mi disco duro, la aplicación se ejecuta sin problemas. Lo mismo ocurre con la configuración actual (vista arriba) cuando se ejecuta la aplicación desde IntelliJ.

Siento que he agotado todos los recursos (incluido StackOverflow, algunos errores muy similares), pero no puedo entender qué es exactamente lo que está mal.

Asegúrese de que su sample.fxml esté en el directorio src/main/resources/ (o en un subdirectorio). Entonces puedes acceder al archivo de esta manera:

 Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("sample.fxml")); 

Explicación : durante la fase de comstackción, todos los recursos y clases se copian en target/classes/ . Entonces su archivo fxml reside en este directorio y su clase en un subdirectorio con respecto al nombre de su paquete. Si llama a getClass().getResource("sample.fxml"); el archivo se buscará en relación con el archivo de clase que será este directorio: target/classes/sample/ .

Llamar .getResource() en el cargador de clases establece la ruta de búsqueda relativa a target/classes/ y, por lo tanto, se encuentra el archivo.

PD: también puedes escribir:

 Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml")); 

Dado que @ Absurd-Mind ya se explicó, maven no copiará ningún archivo de recursos (como fxml) que se encuentre debajo del directorio src .

Si desea conservar los archivos fxml además de los archivos fuente java, puede usar el complemento maven para copiarlos:

  ...   false src/main/java  **/*.fxml    ...  

Tuve el mismo problema con Intelij y Gradle: Pasos para solucionarlo:

1.Movimiento de archivo

sample.fxml

a la ruta

\ src \ main \ resources \ fxml

  1. Establezca la ruta en este archivo:

Parent root = FXMLLoader.load (getClass (). GetResource (“/ fxml / sample.fxml”));

Para aquellos que usan gradle como su sistema de comstackción, agregue esto a su archivo build.gradle :

 sourceSets.main.resources { srcDirs = ["src/main/java"]; //assume that your java classes are inside this path exclude "**/*.java" } 

Luego, limpia y reconstruye tu proyecto.

Entonces, ¿qué hará? Si tiene un view.fxml dentro de su paquete com.example.myfxapp , después de com.example.myfxapp su proyecto, se exportará a /resources/com/example/myfxapp/view.fxml

Para mí, me había encargado de seguir las cosas

  1. Asegúrese de que el archivo fxml esté ubicado donde reside su clase principal. Y luego cárguelo usando esto – (En mi caso, TechJFX.fxml es el archivo)

     FXMLLoader loader = new FXMLLoader(getClass().getResource("TechJFX.fxml")); 
  2. Agregue opencv – *. Jar a la carpeta de su proyecto (en mi caso, opencv-300.jar)

  3. Agregue el jar a la ruta de comstackción usando

Haga clic derecho en la carpeta del proyecto -> Ruta de acceso de comstackción -> Configurar ruta de acceso de comstackción -> Pestaña Bibliotecas -> Agregar JARS externos y busque el archivo jar

Además, bajo Ordenar y Exportar -> Marque opencv-300.jar y la Biblioteca del Sistema JRE (si no está ya marcada)

  1. Copie opencv_java * .dll (en mi caso, opencv_java300.dll) en la misma ubicación donde jar está en la carpeta del proyecto.

  2. Agregue el siguiente método a su clase principal

      static{ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); } 
  3. Hecho.

Espero que esto ayude a alguien a enfrentar un problema similar.