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