【问题标题】:JavaFX and maven: NullPointerException: Location is requiredJavaFX 和 maven:NullPointerException:需要位置
【发布时间】:2014-03-26 20:42:45
【问题描述】:

我一直在尝试使用 JavaFX 设置 Maven。尽管我对 Maven 和 JavaFX 没有经验,但我没想到它会带来这么大的挑战。我的 Java 知识相当扎实(包括 Swing),没想到设置它会有这么大的困难。

我从 IntelliJ 13.0 Community Edition 提供的 JavaFX 项目开始。我的 Main 类中的代码比较小:

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

我的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>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>

我正在使用JavaFX Maven Plugin 来构建应用程序。运行mvn clean jfx:jar 后一切似乎都很好,所有构建都成功了。但是当我尝试运行应用程序时,出现以下错误:

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

经过一些粗略的调试后,问题似乎出在我从中加载文件的路径上。将sample.fxml 硬编码到我硬盘上的某个位置后,应用程序运行没有任何问题。从 IntelliJ 运行应用程序时,当前设置(如上所示)也是如此。

我觉得我已经用尽了所有资源(包括 StackOverflow,一些非常相似的错误),但我就是不知道到底出了什么问题。

【问题讨论】:

  • getClass().getResource("../sample.fxml") 为空。也许试试getClass().getResource("resources/sample.fxml")getClass().getResource("/resources/sample.fxml")
  • getClass().getResource("../sample.fxml") 在调试器中工作,而不是在 Maven 中。我已经尝试了你的建议,但都没有奏效,我只是不知道该怎么做。

标签: java maven javafx


【解决方案1】:

我的应用程序中有类似的异常。 这就是我解决它的方法应用程序正在使用WinPcap 4.1.3库,我将它安装在我的计算机上异常消失了 如果您的应用程序使用了一个库并且它没有安装在您的计算机上,那么您必须将它安装在您的计算机上。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

我的案例是将 javafx sdk 安装到C:\Program Files\Java\openjfx-11.0.2_windows-x64_bin-sdk

而根本原因是sdk路径名中包含的空格。

通过将javafx sdk安装到名称不带空格的文件夹来修复,例如C:\javafx-sdk-11.0.2\lib

【讨论】:

    【解决方案3】:

    我在 Intelij 和 Gradle 上遇到了同样的问题。

    修复步骤:

    1.移动文件

    sample.fxml

    到路径

    \src\main\resources\fxml

    1. 在这个文件上设置路径:

    父根 = FXMLLoader.load(getClass().getResource("/fxml/sample.fxml"));

    【讨论】:

    • NetBeans 8.2 喜欢这个答案,特别是因为它会自动将 .fxml 文件放在这个目录中。
    【解决方案4】:

    正如@Absurd-Mind 已经解释的那样,maven 不会复制位于src 目录下的任何资源文件(如fxml)。

    如果你想保留java源文件之外的fxml文件,你可以使用maven资源插件来复制它们:

    <build>
        ...
        <resources>
            <resource>
                <filtering>false</filtering>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.fxml</include>
                </includes>             
            </resource>
        </resources>
        ...
    </build>
    

    【讨论】:

    • 爱它。这终于是答案了。既然 FXML 是 Java 11 世界,我就被这个错误所困扰! @mrak
    • 你拯救了我的一天......我真的需要这个,否则它不会在 mvn clean install 上执行。它对我有用。但是我在这里有一个问题,如果我们得到了 jar,我在想所有东西都应该进入 jar,而外人不应该看到其他任何东西,这样我就可以只执行一个文件,如何实现这一点?对此的任何帮助表示赞赏
    • 添加 maven 框架后,我的 javafx 这工作了。我还添加了 .css 文件,就像 fxml 一样。
    【解决方案5】:

    对于那些使用 gradle 作为构建系统的人,请将其添加到您的 build.gradle 文件中:

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

    然后清理并重建您的项目。

    那么它会做什么呢?如果您的com.example.myfxapp 包中有view.fxml,则在构建项目后,它将导出到&lt;build dir&gt;/resources/com/example/myfxapp/view.fxml

    【讨论】:

      【解决方案6】:

      对我来说,我已经处理了以下事情 -

      1. 确保 fxml 文件放置在您的主类所在的位置。然后使用它加载它 - (在我的情况下,TechJFX.fxml 是文件)

        FXMLLoader loader = new FXMLLoader(getClass().getResource("TechJFX.fxml"));
        
      2. 将 opencv-*.jar 添加到您的项目文件夹(在我的情况下为 opencv-300.jar)

      3. 使用

      4. 将 jar 添加到构建路径

      右键项目文件夹 -> 构建路径 -> 配置构建路径 -> 库选项卡 -> 添加外部 JARS 并找到该 jar

      另外,在订购和导出下 -> 勾选 opencv-300.jar 和 JRE 系统库(如果尚未勾选)

      1. 将 opencv_java*.dll(在我的例子中为 opencv_java300.dll)复制到项目文件夹中 jar 所在的同一位置。

      2. 将以下方法添加到您的主类中

         static{ 
                System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
           }
        
      3. 完成。

      希望这对面临类似问题的人有所帮助。

      【讨论】:

        【解决方案7】:

        确保您的sample.fxml 位于src/main/resources/ 目录(或子目录)中。然后你可以像这样访问文件:

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

        说明: 在编译阶段,所有资源和类都被复制到target/classes/。因此,您的 fxml 文件位于此目录中,您的类位于与其包名称有关的子目录中。如果您调用getClass().getResource("sample.fxml");,该文件将相对于该目录的类文件进行搜索:target/classes/sample/

        在类加载器上调用 .getResource() 会将相对搜索路径设置为 target/classes/,从而找到您的文件。

        附:你也可以写:

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

        【讨论】:

        • 非常感谢!我的 java 路径问题已经有一段时间了,你的清晰解释解决了我的问题和问题。
        • @Absurd-Mind 但我有不止一个 Build 运行。其中一些不使用其他构建的 fxml,所以我不想将我所有的 fxml 包含到我的所有构建中!我的窗口在“views/ClientWindow.fxml”下,我的主窗口在“controllers/Main.java”下。不知怎的,我似乎无法让它工作......非常烦人。
        猜你喜欢
        • 2019-03-26
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 1970-01-01
        • 2013-12-28
        • 2015-04-18
        • 1970-01-01
        • 2014-05-11
        相关资源
        最近更新 更多