【问题标题】:javafx resource cannot be loaded when running from jar从 jar 运行时无法加载 javafx 资源
【发布时间】:2014-09-10 12:57:04
【问题描述】:

当我尝试使用 IntelliJ IDEA 构建和运行按钮运行时,应用程序运行良好。但是在我将项目构建为可执行的 javafx jar 工件并尝试使用java -jar AppName.jar 从命令行运行后,它显示以下错误:

    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:483)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:367)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)
    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:483)
    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:894)
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56)
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
    at main.MainApplication.start(MainApplication.java:62)
    at com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837)
    at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher`.java:95)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.access$200(GtkApplication.java:48)
    at com.sun.glass.ui.gtk.GtkApplication$6$1.run(GtkApplication.java:149)
    ... 1 more

这是我从第 60 行到第 63 行的代码

    FXMLLoader fxmlLoader = new FXMLLoader();
    URL resource = getClass().getResource("../ui/note_main.fxml");
    InputStream inputStream = resource.openStream(); //THIS HERE IS THE NULLPOINTEREXCEPTION
    Parent root = fxmlLoader.load(inputStream);

似乎资源在第二个 ln 上分配给 null。我在加载过程中做错了吗?从 jar 可执行文件运行时,工作方式是否有所不同?

提前致谢!

【问题讨论】:

    标签: java intellij-idea javafx javafx-2 javafx-8


    【解决方案1】:

    Jar 文件系统不支持带有 .. 的相对路径 - 它可以在 intellij、netbeans、eclipse 中使用,因为您可以从本地文件系统加载。

    【讨论】:

    • 谢谢,但是你有解决办法吗?
    • 是的,使用绝对路径 my/sample/ui/note_main.fxml 和 getClass().getClassloader() 代替
    • 感谢@tomsontom!以后有同样顾虑的人:我得打电话getClass().getClassLoader().getResource("package/where/the/res/is/located.fxml")
    【解决方案2】:

    我正在通过这样的资源加载:

    FXMLLoader statusbarLoader = new FXMLLoader(
                    StatusbarController.class.getResource("/../../../../StatusbarView.fxml"));
            try {
                statusbarPane = (Pane) statusbarLoader.load();
            } catch (IOException e) {
                logger.error(e);
                Starter.terminateApplicationBecauseOfError("Problems loading StatusbarView.fxml");
            }
    

    在我的命令中除了前导 / 看起来很相似。您确定您的 ui-package 位于您当前课程的一个包中吗?

    【讨论】:

    • 它似乎在 IDE 上工作。我回家后会试试你的建议! :)
    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 2014-10-11
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多