Не удалось найти файлы FXML после сборки проекта

Чтобы изучить JavaFX, я создал свой первый проект с использованием IntelliJ IDEA и экспортировал его как проект Eclipse. Все работает хорошо, когда я запускаю проект в этих двух IDE. К сожалению, после создания проекта и попытки запустить файл .jar или .exe я получаю исключение, и я думаю, что проблема в FXMLLoader, который не может найти файлы fxml.

public void initRootLayout() {
        try {
            // Load root layout from fxml file.
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(Main.class.getResource("../view/RootLayout.fxml"));
            rootLayout = (BorderPane) loader.load();
            // Show the scene containing the root layout.
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            primaryStage.show();
            // Give the controller access to the main app.
            RootLayoutController rootLayoutController = loader.getController();
            rootLayoutController.setMain(this);
        } catch (IOException e) {
            showExceptionDialog(e);
        }
        // Try to load last opened person file.
        File file = getPersonFilePath();
        if (file != null) {
            loadPersonDataFromFile(file);
        }
    }

Иерархия проекта

Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: Location is not set.
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2434)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
        at com.melkojji.controller.Main.initRootLayout(Unknown Source)
        at com.melkojji.controller.Main.start(Unknown Source)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
        ... 1 more
Exception running application com.melkojji.controller.Main

person Mustapha El Kojji    schedule 28.01.2017    source источник
comment
Вы всегда можете попробовать Netbeans.   -  person Sedrick    schedule 29.01.2017


Ответы (1)


Я не думаю, что ваши файлы fxml упаковываются вместе с банкой. Вы должны использовать папку resources. Перейдите в настройки вашего проекта и установите папку ресурсов модуля.

person Oliver Yasuna    schedule 28.01.2017
comment
Где я должен добавить или найти этот файл resources. У меня уже есть файл resources в каталоге сборки. Должен ли я использовать его? Должен ли я редактировать путь в коде? - person Mustapha El Kojji; 29.01.2017
comment
@MustaphaELKOJJI Проверьте содержимое файла jar, прежде чем реструктурировать проект. Я не думаю, что это проблема (или, по крайней мере, не вся проблема). - person James_D; 29.01.2017
comment
Вы не должны обязаны помещать ресурсы, отличные от Java, в отдельную папку, все, что вам нужно сделать, это убедиться, что они развернуты при сборке проекта. (Я никогда не использую папку ресурсов, мне просто удобнее иметь файл FXML в той же папке, что и исходный код соответствующего контроллера.) Тем не менее, вы должны использовать правильные имена ресурсов, и .. не является допустимым именем ресурса. . - person James_D; 29.01.2017
comment
Даже после замены ../view/RootLayout.fxml на /com/melkojji/view/RootLayout.fxml проблема та же. - person Mustapha El Kojji; 29.01.2017
comment
@MustaphaELKOJJI Тогда вы должны проверить, что файл fxml развертывается в файле jar, как подразумевает OliverYasuna в этом ответе. Вы можете легко проверить содержимое файла jar (jar tf myjarfile.jar из командной строки) и посмотреть, находится ли там файл fxml и находится ли он в правильном месте. - person James_D; 29.01.2017
comment
Да, файлы fxml развернуты в файл jar. - person Mustapha El Kojji; 29.01.2017
comment
Большое спасибо за ваше замечательное обсуждение и помощь. Я забыл заменить .. в другой функции, и ошибка была такой же. Теперь это работает. - person Mustapha El Kojji; 29.01.2017