导出到 jar 文件时,JavaFX 应用程序不加载 fxml 文件

Jam*_*eld 0 javafx jar fxml

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

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

文件结构

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

方法调用

项目结构 项目结构

通过 CMD 运行 通过 CMD 运行

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

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

Sla*_*law 5

扩展我的评论...

回答

在您的代码中,您正在调用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

尽管该文件实际上已命名,但它适用于 Windows,AddHolidayDialog.fxml因为 Windows 具有不区分大小写的文件系统。

从 JAR 运行

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

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

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