提问者:小点点

Groovy DSL“运行”的Gradle Kotlin DSL等价物?


我试图按照这里的说明,使用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”程序,但到目前为止,这似乎出奇地困难。)。

如有任何帮助,我们将不胜感激。


共1个答案

匿名用户

使用配置避免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")
    }
}