我有一个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开始
编辑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
我在互联网上抬头,找不到任何有用的资源。
答案 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文件的同一文件夹中。