【问题标题】:FXML layout not loaded when run jar outside Eclipse在 Eclipse 之外运行 jar 时未加载 FXML 布局
【发布时间】:2014-10-12 19:54:54
【问题描述】:

我尝试按如下方式加载我的 fxml 布局文件:

 FXMLLoader loader = new FXMLLoader();
 loader.setLocation(getClass().getResource("view/MainLayout.fxml"));
 AnchorPane personOverview = (AnchorPane) loader.load();

当我在 Eclipse 中运行应用程序时,一切正常,但是当我使用 Ant 部署应用程序时,出现错误:

构建项目后,我的文件夹结构是:

在部署的 jar 中也一样

我知道解析 jar 和 eclipse 中的路径可能存在差异,但我无法解决这个问题。 我使用 Java 1.8 和 JavaFX 8。

更新 1 根据错误,我认为它使用绝对 URL 解析路径(以 file:/C:/... 开头),但应该在 jar 文件中使用相对 url。为什么它使用绝对路径是主要问题。

更新 2

有趣的是,使用相同的代码成功加载了根布局..

FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainApp.class.getResource("view/RootLayout.fxml"));
rootLayout = (BorderPane) loader.load();

但内部布局初始化失败。

堆栈跟踪:

java -jar MeterChecker.jar
javafx.fxml.LoadException: unknown path

at javafx.fxml.FXMLLoader.constructLoadException(Unknown Source)
at javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml.FXMLLoader.load(Unknown Source)
at com.wolf6969.checker.MainApp.showMain(Unknown Source)
at com.wolf6969.checker.MainApp.start(Unknown Source)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$153(Unknown Source)
at com.sun.javafx.application.LauncherImpl$$Lambda$51/138227185.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$45/584634336.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$164(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$47/94326726.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$46/501263526.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.lambda$null$141(Unknown Source)
at com.sun.glass.ui.win.WinApplication$$Lambda$37/96639997.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: 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 sun.reflect.misc.Trampoline.invoke(Unknown Source)
at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
... 18 more
Caused by: java.lang.NullPointerException
at com.wolf6969.checker.service.SmsService.getCommandKeys(Unknown Source)
at com.wolf6969.checker.view.MainController.setupControls(Unknown Source)
at com.wolf6969.checker.view.MainController.initialize(Unknown Source)
... 27 more
Exception in Application stop 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.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
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 sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application stop method
at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$147(Unknown Source)
at com.sun.javafx.application.LauncherImpl$$Lambda$48/752848266.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at com.wolf6969.checker.MainApp.stop(Unknown Source)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$154(Unknown Source)
at com.sun.javafx.application.LauncherImpl$$Lambda$147/1418913435.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$166(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$45/584634336.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$164(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$47/94326726.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$46/501263526.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.lambda$null$141(Unknown Source)
at com.sun.glass.ui.win.WinApplication$$Lambda$37/96639997.run(Unknown Source)
... 1 more
Exception running application com.wolf6969.checker.MainApp

【问题讨论】:

  • 尝试使用 MainApp.class.getResource 而不是 getclass.getResource
  • 试过了,没有任何改变。在 Eclipse 中完美运行,执行 jar 时出现同样的错误。现在我使用以下代码:FXMLLoader loader = new FXMLLoader();loader.setLocation(MainApp.class.getResource("view/RootLayout.fxml");
  • 尝试从命令提示符运行 jar 并发布完整跟踪
  • 我在更新 2 中添加了堆栈跟踪
  • 我注销了由 getResource 创建的 URL,它包含:jar:file:/C:/workspace/MeterChecker/build/deploy/bundles/MeterChecker/app/MeterChecker.jar!/com/wolf6969/checker/view/MainLayout.fxml 为什么绝对是 jar 的位置而不是类路径?

标签: java eclipse ant javafx fxml


【解决方案1】:

我正在使用以下代码

 FXMLLoader loader=new FXMLLoader(Main.class.getResource("views/MainFrame.fxml"));
 AnchorPane rootpane=(AnchorPane) loader.load();

它正在正常工作

编辑:查看您的跟踪后,我认为问题出在您的控制器中,请尝试查看此 link

Caused by: java.lang.NullPointerException
at com.wolf6969.checker.service.SmsService.getCommandKeys(Unknown Source)
at com.wolf6969.checker.view.MainController.setupControls(Unknown Source)
at com.wolf6969.checker.view.MainController.initialize(Unknown Source)

【讨论】:

  • 你说得对,问题是包含一些配置文件的资源文件夹没有复制到部署目录。十分感谢!现在可以了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2015-09-07
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多