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
已经在你的反应器的依赖项中。
似乎 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
已经在你的反应器的依赖项中。