Загрузка CSS в Java с JavaFX работает в IntelliJ, но не в jar, созданном Gradle - PullRequest
0 голосов
/ 30 октября 2018

У меня проблемы с получением кода, использующего 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. Перемещение моих 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 для наиболее важных графических элементов. Он не идеален, но работает и этого достаточно для моих целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...