Jar не находит путь для файлов .fxml - PullRequest
0 голосов
/ 02 июля 2019

Я разрабатываю настольное приложение в javafx, и в отличие от Intellij, он jar-файл возвращает ноль для getClass().getResource(pagePath).

Когда я собираю и запускаю приложение с Intellij, все отлично работает и выполняет свою работу, но после того, как я создал артефакт и запустил файл .jar из командной строки, я получил ошибку:

'Исключение в потоке "Поток приложений JavaFX"

java.lang.NulPointerException: требуется местоположение. ' После многих исследований и тестов я обнаружил, что вызов getClass().getResource(pagepath) возвращает ноль в .jar, но не с Intellij. Я пытался изменить способ написания пути, изменить шаблоны и изменить структуру проекта.

Вот инкриминируемый метод

protected void loadPage(ActionEvent event, String pagePath) throws IOException {
        System.out.println(getClass().getResource(pagePath));
        Parent pageParent = FXMLLoader.load(getClass().getResource(pagePath));
        Scene newPage = new Scene(pageParent);
        pageParent.getStylesheets().add(Views.CSS);
        Stage window = (Stage) ((javafx.scene.Node)event.getSource()).getScene().getWindow();
        window.setScene(newPage);
        window.show();
    }

Инициализация работы программы, файл .jar правильно запускает первую страницу этим методом в главном классе.

@Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource(Views.XML_ACCUEIL));
        primaryStage.getIcons().add(new Image(Views.APP_ICON));
        primaryStage.setTitle(Views.APP_NAME);
        primaryStage.setScene(new Scene(root, Views.WIDTH, Views.HEIGHT));
        primaryStage.show();
    }

Класс View выглядит следующим образом:

public class Views {
    public static final String home = System.getProperty("user.home");
    public static final String REGISTER_FOLDER = home + File.separator + "Desktop" + File.separator;
    public static final String XML_ACCUEIL = "resources/accueil.fxml";
    public static final String XML_VENTE_FORM = "resources/vente_form.fxml";
    public static final String XML_DEPOT_FORM = "resources/depot_form.fxml";
    public static final String XML_TECHNIQUE_FORM_1 = "resources/technique_form_1.fxml";
    public static final String XML_TECHNIQUE_FORM_2 = "resources/technique_form_2.fxml";
    public static final String XML_TECHNIQUE_FORM_3 = "resources/technique_form_3.fxml";
    //{some others var}
    public static final String CSS = "sample/resources/style.css";
    public static final String APP_NAME = "World Of Cars Desktop";
    public static final String APP_ICON = "sample/resources/logo_petit.png";
    public static final int WIDTH = 1280;
    public static final int HEIGHT = 720;
}

Вот структура:

-src
    -sample
        -controller
            {all my controller class}
        -resources
            {all my fxml files}
        -DocFiller
        -Main
        -Views

С Intellij все работает отлично, как я сказал, но файл .jar просто запускает домашнюю страницу, и когда я использую кнопку, обычно вызывается метод loadPage, и появляется следующая страница, но вместо этого выдается ошибка, когда Я пытаюсь показать любую другую страницу, кроме домашней. Все страницы, изображения и ресурсы хранятся и называются одинаково.

1 Ответ

1 голос
/ 02 июля 2019

Я бы ожидал "/accueil.fxml" или "/resources/accueil.fxml".Посмотрите в jar с 7tzip или что такое реальный путь.

Путь к ресурсу "resources/accueil.fxml" указывает, что в пути к классу в подкаталоге getClass() (каталог пакета класса) должно бытьподкаталог resources.

Другая ошибка может заключаться в том, что имена файлов не чувствительны к регистру в Windows, когда не запускается jar.Файл jar (zip), Linux и Mac имеют имена файлов с учетом регистра.Проверьте регистрозависимое написание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...