Я создаю приложение JavaFx с Gradle на Windows 10. Я создал проект с помощью задачи инициализации Gradle, поэтому структура каталогов
src
|--- main
|--- java
| |--- thomas/software/helloworld/App.java (Main class)
| |--- thomas/software/helloworld/MainViewController.java (extends JavaFX Application)
|--- resources
|--- imgs/ (some images)
|--- layout/ (fxml files)
В моем контроллере я пытаюсь загрузить макет file:
FXMLLoader loader = new FXMLLoader(
getClass().getResource("../../../layout/main.fxml").toURI().toURL());
И я загружаю изображения следующим образом:
path = getClass().getClassLoader().getResource("imgs/question.png").toExternalForm();
Оба способа работают взаимозаменяемо, когда я запускаю проект с gradle run
или gradlew run
.
Моя проблема в том, что когда я запускаю gradlew distZip
полученный дистрибутив, запускаю из сгенерированного пакетного файла, не могу найти файл макета и выдает исключение нулевого указателя.
Структура сгенерированного jar-файла в build / libs и в zip-файле в build / дистрибутивах идентична и выглядит следующим образом:
imgs/ (images are there)
layout/ (layout file also there)
META-INF/
thomas/software/helloworld/ (everything there as well)
Вот мой файл build.gradle:
/*
* This file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java project to get you started.
* For more details take a look at the Java Quickstart chapter in the Gradle
* User Manual available at https://docs.gradle.org/6.1/userguide/tutorial_java_projects.html
*/
plugins {
// Apply the java plugin to add support for Java
id 'java'
// Apply the application plugin to add support for building a CLI application.
id 'application'
id 'org.openjfx.javafxplugin' version '0.0.8'
}
javafx {
version = "13"
modules = ['javafx.controls', 'javafx.fxml']
}
tasks.withType(JavaExec) {
if (System.getProperty('DEBUG', 'false') == 'true') {
jvmArgs '-Xdebug', '-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9099'
}
}
repositories {
// Use jcenter for resolving dependencies.
// You can declare any Maven/Ivy/file repository here.
jcenter()
}
dependencies {
// This dependency is used by the application.
implementation 'com.google.guava:guava:28.1-jre'
// Use JUnit Jupiter API for testing.
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.5.2'
// Use JUnit Jupiter Engine for testing.
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.2'
}
application {
// Define the main class for the application.
mainClassName = 'thomas.software.helloworld.App'
}
test {
// Use junit platform for unit tests
useJUnitPlatform()
}
Java Версия 13
Версия Gradle 6.1.
Чего мне не хватает?