我目前正在研究JavaFX中的一个项目。我现在有以下文件夹/项目结构:
当我将项目编译到jar中时,我现在在从主程序包以外的程序包访问我的.fxml文件时遇到问题。包main_interface中的文件夹layout_elements包含我的所有.fxml文件。
我使用以下代码在main_interface文件夹的main_window类中加载我的fxml:
FXMLLoader login_loader = new FXMLLoader(getClass().getResource("layout_elements/login_interface.fxml));
我使用以下代码在不在main_interface但在包user_interface_channel中的类中加载fxml:
FXMLLoader fxmlLoader = new FXMLoader(getClass().getResource("/main_interface/layout_elements/chatwindow.fxml));
当我在IDE中编译和运行项目时,两种变体都可以正常工作。但是,如果我构建项目并将其打包到Jar中,则只有第一个语句有效。一旦我的项目执行第二个代码片段,程序就会崩溃并出现错误:
网址无效:找不到无效的网址或资源。
我也试过替换第二个代码:
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&上找到任何有关该问题的信息。谷歌。
反汇编jar会显示所有.fxml文件都包含在Jar中。
答案 0 :(得分:0)
由于您在与FXML文件相同的包中包含类,因此可以使用该包中的类来访问资源。即你可以做到
FXMLLoader login_loader = new FXMLLoader(Login_controller.class.getResource("layout_elements/login_interface.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"));