"NullPointerException: Местоположение обязательно."при запуске JAR проекта JavaFX, но не при запуске из IDE - PullRequest
1 голос
/ 30 апреля 2019

У меня есть проект JavaFX. Он работает нормально изнутри IDEA. Но когда я экспортирую его как Runnable JAR и попробую запустить его из командной строки usin gcommand java -jar MYJavaFXProject.jar, он выдаст следующую ошибку: java.lang.NullPointerException: Location is required.

java.lang.NullPointerException: Location is required.
     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3207)
     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
     at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
     at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
     at application.Main.start(Main.java:16)
     at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
     at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
     at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
     at java.security.AccessController.doPrivileged(Native Method)
     at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(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$147(WinApplication.java:177)
     at java.lang.Thread.run(Unknown Source)

Раньше я сталкивался с этой же проблемой, когда запускал ее из Eclipse, но это казалось действительной проблемой местоположения и было решено после того, как я исправил путь.

Ниже приведена строка № 16 файла Main.java:

Object root = FXMLLoader.load(getClass().getResource("Sample.fxml"));

и Файл Main.java:

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            Object root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
            Scene scene = new Scene((Parent) root,1400,800);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
            primaryStage.setResizable(false);
            primaryStage.setHeight(820);
            primaryStage.setWidth(1330);

        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

Мои Main.java и Sample.fxml файлы находятся в одном пакете.

РЕДАКТИРОВАТЬ 1 ЗАПУСК

enter image description here

РЕДАКТИРОВАТЬ 1 КОНЕЦ

РЕДАКТИРОВАТЬ 2 ЗАПУСКА

Я также подтвердил, что Sample.fxml присутствует в окончательном упакованном jar-файле. Я выполнил следующую команду:

C:\Users\Asif\Desktop>jar -tf MyJavaFXTool.jar | find "Sample.fxml"

который вернул src/application/Sample.fxml. Таким образом, это подтверждает, что файл Sample.fxml присутствует в JAR.

РЕДАКТИРОВАТЬ 2 КОНЕЦ

Я посмотрел в Интернете и не смог найти ни одного полезного ресурса.

1 Ответ

0 голосов
/ 02 мая 2019

Если вы используете maven для сборки вашего jar, вам может понадобиться добавить и настроить плагин ресурса.

Это и пример конфигурации с использованием макета maven по умолчанию.

    <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.7</version>
        <executions>
            <execution>
                <id>copy-fxml-resources</id>
                <!-- here the phase you need -->
                <phase>validate</phase>
                <goals>
                    <goal>copy-resources</goal>
                </goals>
                <configuration>
                    <outputDirectory>${basedir}/target/classes/</outputDirectory>
                    <resources>
                        <resource>
                            <directory>src/main/java/</directory>
                            <filtering>false</filtering>
                            <includes>
                                <include>**/*.fxml</include>
                                <include>**/*.css</include>
                            </includes>
                        </resource>
                    </resources>
                </configuration>
            </execution>
        </executions>
    </plugin>

Maven не будет копировать ваши ресурсы, если они не находятся в папке src/main/resources/, поэтому вы должны использовать maven-resources-plugin, чтобы выбрать, какие файлы вы хотите скопировать из исходной папки в папку bin.

У меня была более или менее та же проблема, потому что SceneBuilder не полностью понимает макет maven, поэтому мне пришлось поместить fxml и css в одну и ту же папку файлов Java.

...