【问题标题】:OpenJFX 11 - javafxpackager Binary CSSOpenJFX 11 - javafxpackager 二进制 CSS
【发布时间】:2020-02-11 04:01:12
【问题描述】:

似乎 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,还是不再支持整个事情?

【问题讨论】:

    标签: java css javafx openjfx openjdk-11


    【解决方案1】:

    虽然jpackage tool 可能会添加到 Java 14,但我不知道它会使用 Css2Bin

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

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

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

    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 或命令行以类似的方式运行相同的任务。

    【讨论】:

    • 非常感谢您的详细回答 :) 这对我帮助很大。
    • 生成的bss文件如何自动直接写入build目录,而不需要添加到resources目录?
    • Css2Bin 允许使用输出的文件名(和路径)的第二个参数。
    • 好的,你有这方面的例子吗?
    • 不,试试看。最好发布一个新问题。
    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2013-01-01
    • 2019-04-06
    • 1970-01-01
    • 2019-03-19
    • 2018-11-11
    相关资源
    最近更新 更多