У меня проблемы с получением кода, использующего JavaFX, для запуска в jar-файле. Он хорошо работает в Intellij, но когда я пытаюсь запустить файл JAR, я получаю:
Exception in Application start method caused by java.lang.NullPointerException
Обсуждаемая строка: loginScene.getStylesheets().add(LoginUI.class.getResource("UI.css").toExternalForm());
Я использую Gradle для сборки своего jar-файла, поэтому я думаю, что моя проблема вызвана моим скомпилированным кодом, не включающим файл UI.css. Мой css-файл в настоящее время находится в том же каталоге, что и мой класс LoginUI.
Мой файл build.gradle выглядит так:
apply plugin: 'java'
sourceCompatibility = 1.11
repositories {
mavenCentral()
}
def currentOS = org.gradle.internal.os.OperatingSystem.current()
def platform
if (currentOS.isWindows()) {
platform = 'win'
} else if (currentOS.isLinux()) {
platform = 'linux'
} else if (currentOS.isMacOsX()) {
platform = 'mac'
}
dependencies {
compile "org.openjfx:javafx-base:11:${platform}"
compile "org.openjfx:javafx-graphics:11:${platform}"
compile "org.openjfx:javafx-controls:11:${platform}"
compile "org.openjfx:javafx-fxml:11:${platform}"
compile "com.google.code.gson:gson:2.2.4"
compile "org.apache.commons:commons-lang3:3.6"
compile "org.apache.httpcomponents:httpclient:4.5.6"
}
task run(type: JavaExec) {
classpath sourceSets.main.runtimeClasspath
main = "project.Main"
}
sourceSets {
main {
resources {
srcDirs = ["src/main/java"]
includes = ["**/*.css"]
}
}
}
jar {
manifest {
attributes 'Main-Class': 'main.java.edu.ufl.activitymonitor.Main'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
}
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls,javafx.fxml'
]
}
}
Пока я пробовал:
1. Добавить следующее в мой файл build.gradle (как в это решение ):
sourceSets {
main {
resources {
srcDirs = ["src/main/java"]
includes = ["**/*.css"]
}
}
}
- Перемещение моих css файлов из main / java. в main / resources, так что моя файловая структура выглядит так:
структура каталогов
И затем заменить «UI.css» на: «../../../../resources/UI.css», «../../../resources/UI.css» , "../../../../../resources/UI.css", или "/UI.css", или просто оставьте его как UI.css. Однако это просто приводит к ошибке нулевого указателя в IntelliJ.
Как мне это исправить?
ОБНОВЛЕНИЕ: я также добавил последние две строки в свой build.gradle (с этот вопрос ), и он не работал:
jar {
manifest {
attributes 'Main-Class': 'main.java.edu.ufl.activitymonitor.Main'
}
from {
configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
from('src/main/java') {
include '**/*.css'
}
}
Обновление: Поскольку у меня не так много времени до развертывания кода для эксперимента, я использовал встроенный CSS для наиболее важных графических элементов. Он не идеален, но работает и этого достаточно для моих целей.