“ NullPointerException:必须提供位置。”在运行JavaFX项目JAR时,但在从IDE运行时则不是

时间:2019-04-30 11:16:03

标签: java javafx javafx-8

我有一个JavaFX项目。它在IDEA内部运行良好。但是,当我将其导出为 Runnable JAR 并尝试在命令行中使用gcommand java -jar MYJavaFXProject.jar运行它时,会出现以下错误:java.lang.NullPointerException: Location is required

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 application.Main.start(Main.java:16)
     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)
     at java.lang.Thread.run(Unknown Source)

之前,我在从Eclipse运行它时遇到了相同的问题,但这似乎是有效的位置问题,并且在纠正路径后得到了解决。

下面是Main.java文件的第16行:

Object root = FXMLLoader.load(getClass().getResource("Sample.fxml"));

Main.java文件:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            Object root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
            Scene scene = new Scene((Parent) root,1400,800);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
            primaryStage.setResizable(false);
            primaryStage.setHeight(820);
            primaryStage.setWidth(1330);

        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

我的 Main.java Sample.fxml 文件都在同一程序包中。

修改1开始

enter image description here

编辑1 END

编辑2开始

我还确认了最终打包的jar文件中存在Sample.fxml。我在以下命令中执行:

C:\Users\Asif\Desktop>jar -tf MyJavaFXTool.jar | find "Sample.fxml"

返回了src/application/Sample.fxml。因此,这确认JAR中存在Sample.fxml文件。

编辑2 END

我在互联网上抬头,找不到任何有用的资源。

1 个答案:

答案 0 :(得分:0)

如果使用 maven 来构建jar,则可能需要添加和配置资源插件。

这是使用默认Maven布局进行配置的示例。

    <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
        <executions>
            <execution>
                <id>copy-fxml-resources</id>
                <!-- here the phase you need -->
                <phase>validate</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <outputDirectory>${basedir}/target/classes/</outputDirectory>
                    <resources>
                        <resource>
                            <directory>src/main/java/</directory>
                            <filtering>false</filtering>
                            <includes>
                                <include>**/*.fxml</include>
                                <include>**/*.css</include>
                            </includes>
                        </resource>
                    </resources>
                </configuration>
            </execution>
        </executions>
    </plugin>

如果资源不在src/main/resources/文件夹中,Maven不会复制您的资源,因此您已使用maven-resources-plugin选择要从源文件夹复制到bin文件夹的文件。 / p>

我或多或少都遇到相同的问题,因为 SceneBuilder 不能完全理解Maven布局,因此我不得不将fxml和css放在Java文件的同一文件夹中。