2016-09-10 3 views
0

В настоящее время я работаю над проектом в JavaFX. Я имею следующую структуру папок/проект прямо сейчас:Доступ к ресурсам (fxml) в Jar из разных пакетов

enter image description here

теперь у меня есть проблемы с доступом моих .fxml файлов из других, чем основной пакета, пакетов, когда я скомпилировать мой проект в банку. Папка layout_elements внутри пакета main_interface содержит все мои файлы .fxml.

Я использую следующий код, чтобы загрузить мой FXML в классе main_window в моей папке main_interface:

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, работает только первое утверждение. Как только мой проект выполнит второй фрагмент кода, программа вылетает с ошибкой:

Неверный URL: неверный URL-адрес или ресурс не найден.

Я также попытался заменить второй код, который:

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

я наблюдаю точно такое же поведение тогда. Он работает в среде IDE, но падает при упаковке в банку.

Так что мой вопрос в значительной степени сводится к: Как я могу получить доступ к ресурсам внутри layout_elements из пакета, который не является основным_интерфейсом (который является основным пакетом) таким образом, что он также работает, когда проект скомпилирован в Jar ?

Я уже пробовал практически каждый вариант отказа от имен пакетов, в том числе/исключая руководство /, используя getClassLoader() вместо getClass и т. Д. Я также не нашел никакой информации о этой проблеме на SO & google.

Декомпиляция банки показывает, что все файлы .fxml включены в Jar.

+0

Вы уверены, что ваши FXML файлы развертываются в файл банку? Если файлы FXML находятся в том же пакете, что, скажем, 'Login_controller', вы должны иметь возможность делать новый FXMLLoader (Login_controller.class.getResource (" login_interface.fxml "))'. –

+0

В качестве альтернативы вам следует использовать [правильные соглашения об именах] (https://en.wikipedia.org/wiki/Naming_convention_ (программирование) #Java) для ваших имен классов. –

+0

Я совершенно уверен, поскольку 2 из них загружены полностью отлично. Это чат-клиент. Интерфейс входа в систему отображается правильно, затем отображается главное окно. Просто при открытии чата (который выполняет код не в основном пакете, включая второй оператор) он сбрасывает – Hajaku

ответ

0

Поскольку у вас есть классы в том же пакете, что и файлы FXML, вы можете использовать классы в этом пакете для доступа к ресурсам. То естьвы можете сделать

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")); 
+0

Это не работает. Использование нового FXMLLoader (Login_controller.class.getResource (login_interface.fxml); не работает из-за неправильного расположения (должно быть layout_elements/перед login_interface.Но даже с layout_elements до этого он показывает то же самое поведение (работает в IDE, сбой в Jar) – Hajaku

+0

А, да: ОК, я неправильно читаю структуру папок на скриншоте. Если это не работает в вашем файле jar, я вполне уверен, что по крайней мере некоторые из файлов fxml не находятся в файле jar. Перечислите содержимое файла jar из командной строки ('jar -t myfile.jar') и опубликуйте результаты в своем вопросе. –

Смежные вопросы