【发布时间】:2017-01-18 14:25:44
【问题描述】:
我目前正在从事 JavaFX 的一个项目。我现在有以下文件夹/项目结构:
当我将项目编译到 jar 中时,我现在无法从主包以外的包访问我的 .fxml 文件。包 main_interface 内的文件夹 layout_elements 包含我所有的 .fxml 文件。
我使用以下代码将我的 fxml 加载到我的 main_interface 文件夹中的 main_window 类中:
FXMLLoader login_loader = new FXMLLoader(getClass().getResource("layout_elements/login_interface.fxml));
我使用以下代码将 fxml 加载到不在 main_interface 中但在包 user_interface_channel 中的类中:
FXMLLoader fxmlLoader = new FXMLoader(getClass().getResource("/main_interface/layout_elements/chatwindow.fxml));
当我在 IDE 中编译和运行我的项目时,这两种变体都能正常工作。但是,如果我构建项目并将其打包到 Jar 中,则只有第一个语句有效。一旦我的项目执行第二个代码 sn-p 程序崩溃并出现错误:
无效的 URL:无效的 URL 或找不到资源。
我也尝试用那个替换第二个代码:
FXMLLoader fxmlLoader = new FXMLLoader(main_window.class.getClassLoader.getResource("main_interface/layout_elements/chatwindow.fxml));
然后我观察到完全相同的行为。它可以在 IDE 中运行,但在打包到 Jar 时会崩溃。
所以我的问题几乎可以归结为:如何从一个不是 main_interface(主包)的包中访问 layout_elements 中的资源,以使其在项目编译成 Jar 时也可以工作?
我已经尝试了几乎所有省略包名称的变体,包括/省略前导 /,使用 getClassLoader() 而不是 getClass 等。我也没有在 SO & google 上找到任何关于该问题的信息。
反编译jar显示所有.fxml文件都包含在jar中。
【问题讨论】:
-
您确定您的 FXML 文件正在部署到 jar 文件中吗?如果 FXML 文件与
Login_controller位于同一个包中,您应该可以使用new FXMLLoader(Login_controller.class.getResource("login_interface.fxml"))。 -
顺便说一句,你应该使用proper naming conventions作为你的类名。
-
我很确定,因为其中 2 个已完全加载。这是一个聊天客户端。登录界面正确显示,然后主窗口显示正确。就在打开聊天(执行不在主包中的代码,包括第二条语句)时,它崩溃了
-
你能在你的问题中列出jar文件的内容吗?这将澄清 fxml 文件是否存在,并且还将更清晰地查看文件夹结构。从命令行或终端运行
jar -t myfile.jar,然后edit 你的问题包括结果。 -
抱歉,应该是
jar -tf myfile.jar。