【问题标题】:JavaFX Application not loading fxml files when exported to a jar file导出到 jar 文件时,JavaFX 应用程序未加载 fxml 文件
【发布时间】:2018-10-23 20:44:57
【问题描述】:

我刚刚完成了我的第一个 java 项目,但是我似乎无法正确构建它。它将加载整个计算器运行的初始 fxml 文件,但是当我尝试在假期/休息菜单中添加假期/休息时,应该显示一个对话框窗格,以便用户可以填写信息,但我不断得到一个位置当我在 cmd 中运行 jar 文件时设置错误。当我在 intellij 中启动它而不是在 jar 中时,一切正常。

这就是我设置文件的方式。我在 FinishedCalCulator 项目中做了一个资源目录,并标记为资源根目录

这就是我将 FXML 文件的位置设置到加载器中的方式。当我在 Intellij 中运行它而不是在 jar 文件中运行它时,这有效。

项目结构

通过 CMD 运行

调用目标异常/位置未设置错误

我环顾四周,发现一些帖子谈论将所有 fxml 文件放入资源文件中,我这样做并让它在 Intellij 中再次工作,但是当我尝试添加时它仍然不会显示对话框窗格他们。我不确定我在这里做错了什么。我不认为我完全理解我做错了什么。任何帮助都会很棒。

【问题讨论】:

  • 您的资源文件名为AddHolidayDialog.fxml,但您正在使用getClass().getResource("/addHolidayDialog.fxml") 搜索它。注意到“A”中大小写的不同了吗? JAR 文件的“文件系统”区分大小写。但是,Windows 的文件系统不是。因此,它在从 Intellij 运行而不是从 JAR 运行时可以工作。
  • 请勿发布代码截图。将代码发布为格式化为代码块的文本。在这种情况下,屏幕截图提供的唯一附加信息是getResource 方法参数的名称并突出显示dialog 的出现。不过,此信息对问题并不重要。堆栈跟踪也应该作​​为文本(代码块)而不是屏幕截图发布;将错误流重定向到文本文件并将其复制并粘贴到问题应该足够简单......

标签: javafx jar fxml


【解决方案1】:

扩展我的评论...

回答

在您的代码中,您调用的是getResource("/addHolidayDialog.fxml")。但是,您的资源文件名是 AddHolidayDialog.fxml。只需将代码中的“a”更改为“A”,您的代码就可以工作了。


说明

从 Intellij 运行

当您从 Intellij 运行应用程序时,它会使用 out/production/classes 目录中的输出文件。换句话说,这些类不在 JAR 文件中。当您拨打getClass().getResource("/addHolidayDialog.fxml") 时,您将收到URL 之类的:

file://C:/.../out/production/classes/addHolidayDialog.fxml

尽管文件实际上被命名为AddHolidayDialog.fxml,但它在 Windows 上仍然有效,因为 Windows 有一个不区分大小写的文件系统。

从 JAR 运行

然后您将项目导出到 JAR 并从那里运行它。调用相同的getResource 代码,您现在将获得URL(如果代码有效),例如:

jar:file://C:/.../your-application.jar!/addHolidayDialog.fxml

然而,您的代码实际上从getResource 返回的是null。根据 JAR 文件,资源 addHoldiayDialog.fxml 不存在。但是,它会很高兴地告诉您 AddHolidayDialog.fxml 确实 存在。原因是 JAR 文件具有区分大小写“文件系统”。

【讨论】:

  • 谢谢,就这么简单。我应该明白这一点,如果文件名错误,我不知道 Windows 会实际运行它。感谢您提供信息。
猜你喜欢
  • 1970-01-01
  • 2019-09-29
  • 2016-01-07
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多