Problem with JavaFX project after adding Maven support (Exception in Application start method)
Asked Answered
S

1

2

I created a JavaFX project using JDK 1.8. Works correctly. But if I try to add Maven support, compilation fails.

Firstly, I tried to do it in Java 11 with JavaFX 11 but effect was the same. I spent two days on finding why it doesn't work, glancing at stackoverflow a lot of hours. Finally, I decided to try it on Java 8 but it still haven't solved my problem.

There is no difference if 'sample.fxml' exists in the same folder as Main or in resources, compilation fails on both of them.

SDK is set correctly.

Console log:

Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at sample.Main.start(Main.java:13)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
... 1 more
Exception running application sample.Main

Process finished with exit code 1

pom.xml:

<?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>pl.wojciech</groupId>
<artifactId>javafx11</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </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>sample.Main</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>

There is Main method (generated by IntelliJ, changed multiple times):

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception{
    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);
}
}

And my project structure:

javafx8 [
    .idea {}
    src
        {
        main
            java
                sample
                     Controller
                     Main
                     sample.fxml
                resources
         }
    test {}
    target {}
    javafx8.iml
    pom.xml
]
Santee answered 27/12, 2018 at 22:47 Comment(3)
The stacktrace you posted does not indicate a compilation error. It indicates that you're passing null instead of a url to FXMLLoader. Searching for the error message (Location is required) should yield a few results. If those don't help you unfortunately with the current state of the question we cannot help you, since the information about the location parameter/project structure is missing.Overstrung
Try with Parent root = FXMLLoader.load(Main.class.getResource("/sample/sample.fxml"));Twopenny
I moved fxml to src/main/resources and changed path to "/sample.fxml" - now it works. Thank you! Not enogh rep to give thumbs :( Am I right that the problem is JavaFX changes path after moving fxml and Maven requires only file name when it exists in resources?Santee
L
6

You have your sample.fxml file in the wrong place. Maven (and Gradle) follow a standard directory layout by default. It expects source files to be under src/main/java and resources to be under src/main/resources. Any resource files under src/main/java do not end up on the classpath/modulepath at runtime.

You should either:

  1. Move sample.fxml to src/main/resources. Or,
    • This requires changing your code to getResource("/sample.fxml").
  2. Move sample.fxml to src/main/resources/sample.
    • With this option you can keep your code as is.

Note: You have a directory named src/main/java/resources. I'm assuming this is where you tried to put the FXML file and found it still didn't work. The reason is because Maven doesn't expect resources to be at that location (location indicates source files). Maven expects resources to be under src/main/resources.


But if I try to add Maven support, compilation fails.

The stack trace you posted, as fabian mentions, is not the result of a compilation error. It is a runtime error.

Linctus answered 27/12, 2018 at 23:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.