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

时间:2018-05-14 08:35:00

标签: javafx jar fxml

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

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

File Structure

这就是我如何将FXML文件的位置设置到加载器中。这在我在Intellij中运行时有效,但在jar文件中没有。

Method call

项目结构 Project Structure

贯穿CMD Running through CMD

调用目标异常/位置未设置错误 Invocation Target Exception/Location not set error

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

1 个答案:

答案 0 :(得分:3)

扩展我的评论......

答案

在您的代码中,您呼叫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文件具有区分大小写的“文件系统”。