我在获取使用 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"]
}
}
}
- 从 main/java 移动我的 css 文件。到 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 来处理最重要的图形元素。它并不完美,但它确实有效,并且足以满足我的目的。