Ресурсы чтения JavaFX, Gradle и JPMS всегда возвращают значение null

Я пытаюсь прочитать ресурсы для своего приложения JavaFX, но оно работает, только если module-info не определен. Если module-info определен, я всегда получаю null для следующего кода:

// Replace ... with a specific path, for example: JavaFX_Logo.png
String url = getClass().getResource("...").toExternalForm();

Источник попробовал:

MWE: Я сделал минимальный рабочий пример в github, если кому-то интересно посмотреть результат. Я использую IDE под названием IntelliJ и инструмент сборки под названием Gradle (Kotlin DSL).

Пример кода:

package app;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;


public class App extends Application {

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

    @Override
    public void start(final Stage primaryStage) throws Exception {
        BorderPane root = new BorderPane();
        Pane pane = new Pane(root);
        String url = getClass().getResource("JavaFX_Logo.png").toExternalForm(); // Returns NPE, because getResource return null
        ImageView imageView = new ImageView(url);
        pane.getChildren().add(imageView);
        Scene scene = new Scene(pane, 1024, 768);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

}

информация по модулю:

module ExampleFX.main {
    requires javafx.graphics;

    exports app;
}

Ресурсы к образу: src/main/resources/app/JavaFX_Logo.png

Структура сборки:

build
 ┣ classes
 ┃ ┗ java
 ┃ ┃ ┗ main
 ┃ ┃ ┃ ┗ app
 ┃ ┃ ┃ ┃ ┗ App.class
 ┣ distributions
 ┃ ┣ ExampleFX-1.0-SNAPSHOT.tar
 ┃ ┗ ExampleFX-1.0-SNAPSHOT.zip
 ┣ generated
 ┃ ┗ sources
 ┃ ┃ ┣ annotationProcessor
 ┃ ┃ ┃ ┗ java
 ┃ ┃ ┃ ┃ ┗ main
 ┃ ┃ ┗ headers
 ┃ ┃ ┃ ┗ java
 ┃ ┃ ┃ ┃ ┗ main
 ┣ libs
 ┃ ┗ ExampleFX-1.0-SNAPSHOT.jar
 ┣ resources
 ┃ ┗ main
 ┃ ┃ ┗ app
 ┃ ┃ ┃ ┗ JavaFX_Logo.png
 ┣ scripts
 ┃ ┣ ExampleFX
 ┃ ┗ ExampleFX.bat
 ┗ tmp
 ┃ ┣ compileJava
 ┃ ┃ ┗ source-classes-mapping.txt
 ┃ ┗ jar
 ┃ ┃ ┗ MANIFEST.MF

Редактировать:

  • Добавлен modul-info

Вы создали свой собственный module-info.java или он сгенерирован gradle?

dan1st 02.04.2021 23:18

Я создал свой собственный. Я забыл добавить его в репозиторий github и на свой вопрос. Я добавил это сейчас.

Nyanyan 03.04.2021 00:00

Я не уверен, что org.openjfx.javafxplugin совместим с обработкой модулей, добавленной в Gradle 6.4. Возникает ли проблема при удалении подключаемого модуля JavaFX и добавлении зависимостей JavaFX вручную? Обратите внимание, что вам нужен соответствующий классификатор (например, org.openjfx:javafx-base:<version>:win для Windows); К сожалению, классификатор нарушает разрешение транзитивных зависимостей в Gradle, поэтому вам придется явно добавлять каждую зависимость JavaFX.

Slaw 03.04.2021 00:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
28
0

Другие вопросы по теме