1

似乎 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。

我的问题是:还有没有办法使用 OpenJFX 11 生成二进制 css,还是不再支持整个事情?

4

1 回答 1

2

虽然有一个jpackage 工具可能会添加到 Java 14 中,但我不知道它会使用Css2Bin.

在 OpenJFX (11+) 中,Css2Bin它仍然是内部用于将 Modena CSS 文件转换为 BSS 的工具。你可以在这里找到它。

如果您在 OpenJFX 中搜索此工具的用途,您会在用于构建 JavaFX 本身的文件中找到它。build.gradle

我将粘贴该任务,因为它与查看它的作用相关:

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 jar 来运行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。然后你可能需要在做 jar 时过滤掉 css 的。

当然,相同的任务可以从 Maven 或命令行以类似的方式运行。

于 2019-10-14T16:15:39.697 回答