В настоящее время я работаю над проектом в JavaFX. Я имею следующую структуру папок/проект прямо сейчас:Доступ к ресурсам (fxml) в Jar из разных пакетов
теперь у меня есть проблемы с доступом моих .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.
Вы уверены, что ваши FXML файлы развертываются в файл банку? Если файлы FXML находятся в том же пакете, что, скажем, 'Login_controller', вы должны иметь возможность делать новый FXMLLoader (Login_controller.class.getResource (" login_interface.fxml "))'. –
В качестве альтернативы вам следует использовать [правильные соглашения об именах] (https://en.wikipedia.org/wiki/Naming_convention_ (программирование) #Java) для ваших имен классов. –
Я совершенно уверен, поскольку 2 из них загружены полностью отлично. Это чат-клиент. Интерфейс входа в систему отображается правильно, затем отображается главное окно. Просто при открытии чата (который выполняет код не в основном пакете, включая второй оператор) он сбрасывает – Hajaku