我试图按照这里的说明,使用Gradle,用Kotlin和Java 11构建一个简单的JavaFX11程序。但是,这个页面使用的是Gradle的Groovy DSL,而我正在尝试使用Kotlin DSL。令人惊讶的是,我在谷歌搜索时没有找到一个文档,将每个Groovy构造映射到其等价的Kotlin构造,或者解释如何将Groovy DSL代码转换为等价的Kotlin DSL代码。(这似乎是Gradle文档中的一个大疏忽!)。
特别是,本文档包含以下Groovy代码:
compileJava {
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls'
]
}
}
run {
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'javafx.controls'
]
}
}
据我所知,相当于第一部分的Kotlin似乎是:
tasks.withType<JavaCompile> {
options.compilerArgs.addAll(arrayOf(
"--module-path", classpath.asPath,
"--add-modules", "javafx.controls"
))
}
但是,我一直搞不清楚相当于第二部分的Kotlin DSL是什么。请注意,'run'是Kotlin的标准库中的一个标准函数扩展,因此这段代码的Kotlin版本似乎不能在Kotlin DSL中使用名称'run'来实现相同的目的。
(注:我曾考虑过尝试使用一个支持JavaFX的插件(例如,如本页所述),但该插件似乎使用起来相当复杂,而且我已经在这个项目中遇到了足够多的复杂问题,以至于我不太愿意引入一个文档很少的开源插件。目前我确实在尝试用JavaFX/Gradle生成尽可能简单的“Hello,World”程序,但到目前为止,这似乎出奇地困难。)。
如有任何帮助,我们将不胜感激。
使用配置避免API,与第二个块等效的是:
tasks.named<JavaExec>("run") {
doFirst {
jvmArgs = listOf("--module-path", classpath.asPath,"--add-modules", "javafx.controls")
}
}
关键是run具有javaexec
类型,与任何任务的类型一样,可以通过创建一个任务来发现它,以打印您随后运行的任务的类:
tasks.register("getName") {
doFirst {
print("Class name: ${tasks["run"].javaClass}")
}
}
注意,随着JavaFX应用程序的增长,您将需要指定如下所示的附加模块:
tasks.named<JavaExec>("run") {
doFirst {
jvmArgs = listOf("--module-path", classpath.asPath,
"--add-modules", "javafx.base,javafx.controls,javafx.graphics")
}
}