3

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

4

0 回答 0