【问题标题】:Accessing resources (fxml) in Jar from different package从不同的包访问Jar中的资源(fxml)
【发布时间】: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

标签: java javafx jar fxml


【解决方案1】:

由于您在与 FXML 文件相同的包中具有类,因此您可以使用该包中的类来访问资源。 IE。你可以做

FXMLLoader login_loader = new FXMLLoader(Login_controller.class.getResource("layout_elements/login_interfa‌​ce.fxml"));

FXMLLoader fxmlLoader = new FXMLLoader(main_window.class.getResource("layout_elements/chatwindow.fxml"));

此外,以下任何一项都应该有效:

ClassLoader.getResource() 相对于类路径搜索)

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getClassLoader().getResource("main_interface/layout_elements/chatwindow.fxml"));

Class.getResource() 前导 / 搜索相对于类路径)

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/main_interface/layout_elements/chatwindow.fxml"));

【讨论】:

  • 这不起作用。使用 new FXMLLoader(Login_controller.class.getResource(login_interface.fxml); 由于位置错误而不起作用(在 login_interface 之前需要有 layout_elements/。但即使在此之前使用 layout_elements 它也显示完全相同的行为(在 IDE 中工作,崩溃在罐子里)
  • 啊,是的:好的,我看错了截图中的文件夹结构。如果这在您的 jar 文件中不起作用,我非常确信至少有一些 fxml 文件不在 jar 文件中。从命令行 (jar -t myfile.jar) 列出 jar 文件的内容并将结果发布到您的问题中。
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2012-11-28
  • 2012-05-11
  • 2011-02-08
  • 2015-09-06
  • 1970-01-01
相关资源
最近更新 更多