OpenJFX 11 - javafxpackager 二进制 CSS

OpenJFX 11 - javafxpackager Binary CSS

似乎 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,或者是否不再支持整个过程?

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

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

如果您在 OpenJFX 中搜索此工具的用途,您将 find it 在用于构建 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 public 方法,它只是 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 或命令行以类似的方式 运行。

为了完整起见,以下是何塞的意思

Same task can be run in a similar way from Maven [...]

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.0.0</version>
    <executions>
        <execution>
            <id>css2bss</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>java</goal>
            </goals>
            <configuration>
                <mainClass>com.sun.javafx.css.parser.Css2Bin</mainClass>
                <arguments>
                    <arg>${project.basedir}/src/main/resources/my-theme.css</arg>
                </arguments>
            </configuration>
        </execution>
    </executions>
</plugin>

假设 javafx.graphics 已经在你的反应器的依赖项中。