OpenJFX 11 - двоичный CSS-файл javafxpackager - PullRequest
1 голос
/ 14 октября 2019

Кажется, что JavaFXpackager недоступен в openjdk / openjfx 11.

Я хочу создать двоичный CSS (BSS), используя его.
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/javafxpackager.html
с помощью -createbss это было возможно в прошлом.

В списке рассылки OpenJFX они опубликовали что-то о Filling the Packager gap.
https://mail.openjdk.java.net/pipermail/openjfx-dev/2018-September/022500.html

Но этот новый инструмент не может создатьДвоичный CSS.

Мой вопрос: есть ли еще способ генерировать двоичный CSS с использованием OpenJFX 11 или все это больше не поддерживается?

1 Ответ

1 голос
/ 14 октября 2019

Хотя существует инструмент jpackage , который возможно добавляется в Java 14, я не знаю, что он будет использовать Css2Bin.

в OpenJFX (11+), Css2Bin по-прежнему является инструментом, используемым внутри для преобразования CSS-файлов Modena в BSS. Вы можете найти его здесь .

Если вы будете искать использование этого инструмента в OpenJFX, вы найдете его в файле build.gradle, который используется для сборкиСам JavaFX.

Я вставлю задачу, поскольку важно посмотреть, что она делает:

def modulePath = "${project.sourceSets.main.java.outputDir}"
    modulePath += File.pathSeparator + "${rootProject.projectDir}/modules/javafx.graphics/build/classes/java/main"
    modulePath += File.pathSeparator + "${rootProject.projectDir}/modules/javafx.base/build/classes/java/main"
    processResources {
      doLast {
        def cssFiles = fileTree(dir: "$moduleDir/com/sun/javafx/scene/control/skin")
        cssFiles.include "**/*.css"
        cssFiles.each { css ->
            logger.info("converting CSS to BSS ${css}");

            javaexec {
                executable = JAVA
                workingDir = project.projectDir
                jvmArgs += patchModuleArgs
                jvmArgs += "--module-path=$modulePath"
                jvmArgs += "--add-modules=javafx.graphics"
                main = "com.sun.javafx.css.parser.Css2Bin"
                args css
            }
        }
      }
    }

Как вы можете заметить, в основном вызывается команда java, сJavaFX вызывает в пути к модулю, чтобы запустить открытый метод Css2Bin::main, который является частью включенного модуля javafx.graphics.

Так что ничто не мешает вам делать то же самое в процессе сборки.

Предполагая, что вы используете Gradle, вы можете добавить задачу, выполняемую перед задачей jar, примерно так:

def java_home = hasProperty('org.gradle.java.home') ? 
      getProperty('org.gradle.java.home') : System.getenv('JAVA_HOME')

task css {
    if (java_home == null) {
        throw new RuntimeException("java_home is not defined.")
    }
    def cssFiles = fileTree(dir: "$project.rootDir/src/main/resources/")
    cssFiles.include "**/*.css"
    cssFiles.each { css ->
        logger.info("converting CSS to BSS ${css}")
        doLast {
            exec {
                commandLine "${java_home}/bin/java",
                        "--module-path", sourceSets.main.runtimeClasspath.asPath,
                        "--add-modules", "javafx.graphics",
                        "com.sun.javafx.css.parser.Css2Bin", css
            }
        }
    }
}

Просто запустите:

./gradlew css

и он преобразует все CSS-файлы из ваших ресурсов в bss. Тогда вам, вероятно, понадобится отфильтровать css-файлы при выполнении jar.

Та же задача может быть выполнена аналогичным образом из Maven или командной строки, конечно.

...