Каталог NullPointerException и Resource в JavaFX и Gradle (распространяется через файл jar) - PullRequest
0 голосов
/ 27 мая 2019

Я создаю приложение JavaFX, созданное в Gradle, чтобы больше узнать о процессе создания приложений с графическим интерфейсом в Java. Столкновение на пути, с которым я столкнулся, включает доступ к файлу .mp4, который будет отображаться в окне просмотра мультимедиа. Предполагается, что это приложение будет запускаться через файл .jar, который я смог получить для работы с JavaFX 12 в целом, кроме ссылки на файл.

Я ссылался на это сообщение о переполнении стека , и его решение все еще возвращает нулевой указатель в моем проекте. Использование

Paths.get("src/main/resources/hellofx/Blend_W-gladRLvno7U.mp4").toUri().toString();

работает, но затем выдаст исключение Media в формате jar.

Структура файла выглядит следующим образом:

.
build.gradle
src
|─── main
     |───java
         |───hellofx
             |─── HelloFX.java
             |─── Launcher.java
     |─── resources
          |─── hellofx
               |─── video.mp4

Файл сборки Gradle:

plugins {
    id 'application'
    id 'org.openjfx.javafxplugin' version '0.0.7'
}

repositories {
    mavenCentral()
}

sourceSets {
    main {
        resources {
            srcDirs = ["src/main/resources"]
            includes = ["**/*.mp4"]
        }
    }
}

dependencies {
    /* uncomment for cross-platform jar: */
    runtimeOnly "org.openjfx:javafx-graphics:$javafx.version:win"
//    runtimeOnly "org.openjfx:javafx-graphics:$javafx.version:linux"
//    runtimeOnly "org.openjfx:javafx-graphics:$javafx.version:mac"
}

javafx {
    version = "12.0.1"
    modules = [ 'javafx.controls','javafx.fxml','javafx.media' ]
}

mainClassName = 'hellofx.HelloFX'

jar {
    manifest {
        attributes 'Main-Class': 'hellofx.Launcher'
    }
    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

И код Java:

 public void start(Stage stage) {
        //Parent root = FXMLLoader.load(getClass().getResource("scene.fxml"));

        // Create and set the Scene.
        Scene scene = new Scene(new Group(), 640, 360);
        stage.setScene(scene);

//Returns Null Here (resource)
        final URL resource = HelloFX.class.getResource("imgs/Blend_W-gladRLvno7U.mp4");
//Returns Null here (loc)
        URL loc = this.getClass().getClassLoader().getResource("boop.txt");
        System.out.println(loc);

        String test = Paths.get("src/main/resources/hellofx/Blend_W-gladRLvno7U.mp4").toUri().toString();
        System.out.println(test);
        //Set up Media
        Media media = new Media(test);
        // Create the player and set to play automatically.
        MediaPlayer mediaPlayer = new MediaPlayer(media);
        mediaPlayer.setAutoPlay(true);

        // Create the view and add it to the Scene.
        MediaView mediaView = new MediaView(mediaPlayer);
        ((Group) scene.getRoot()).getChildren().add(mediaView);


        stage.setTitle("JavaFX and Gradle");
        stage.setScene(scene);
        stage.show();
    }

1 Ответ

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

Этому есть простое объяснение.Вы пытаетесь разрешить путь, но это довольно сложно, если он заключен в файл jar.

Так что, если вы хотите, чтобы ваш файл mp4 находился внутри файла jar, сделайте его похожим на загрузочный файл .txt или Blend_W-gladRLvno7U.mp4 , где вы получаете его из своих ресурсов, которые также будут работать внутри упакованного фляги.

Так что в основном что-то вроде этого:

this.getClass().getClassLoader().getResource("/hellofx/Blend_W-gladRLvno7U.mp4");

это должно сработать:)

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