2

我正在尝试使用 Gradle,按照此处的说明,使用 Kotlin 和 Java 11 构建一个简单的 JavaFX 11 程序。但是,此页面使用 Gradle 的 Groovy DSL,我正在尝试使用 Kotlin DSL。令人惊讶的是,我的 Google 搜索没有找到将每个 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 DSL 中,此代码的 Kotlin 版本似乎不能出于相同目的使用名称“run”。

(注意:我考虑尝试使用一个插件来支持 JavaFX(例如,如本页所述),但该插件似乎使用起来相当复杂,而且我已经在这个项目中遇到了足够多的问题,即我很犹豫是否要在其中引入一个文档很少的开源插件。我现在真的正在尝试在 JavaFX/Gradle 中生成最简单的“Hello, World”程序,到目前为止,这似乎非常困难.)。

任何帮助,将不胜感激。

4

3 回答 3

4

使用配置避免 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")
    }
}
于 2018-11-03T16:15:56.623 回答
3

令人惊讶的是,我的 Google 搜索没有找到将每个 Groovy 构造映射到其等效的 Kotlin 构造的文档,或者一般解释如何将 Groovy DSL 代码转换为等效的 Kotlin DSL 代码。

请查看https://guides.gradle.org/migrating-build-logic-from-groovy-to-kotlin/和 esp。配置任务部分。据此,我会说 Kotlin DSL 等价物是

tasks.named<JavaExec>("run").doFirst {
    jvmArgs = listOf('--module-path', classpath.asPath, '--add-modules', 'javafx.controls')
}
于 2018-11-02T12:55:50.133 回答
3

With Gradle 5.0 and kotlin-dsl 1.0, tasks that are registered or created by plugins can be statically accessed through the tasks container (TaskContainer. There is this example provided in the release notes:

plugins {
    java
}

tasks {
    named<Test>("test") {
        testLogging.showStacktraces = true
    }
}

you can now write:

plugins {
    java
}

tasks {
    test {
        testLogging.showStacktraces = true
    }
}

For your example, you are most likely using the application plugin, which registers the run task so you can configure it in a similar matter. One issue to be aware of is that run clashes with the Kotlin stdlib run method so you need to apply some workaround to make sure it gets invoked (see gradle/kotlin-dsl/issues/1175)

tasks {
  compileJava {
    doFirst {
      jvmArgs = listOf("--module-path", classpath.asPath,
          "--add-modules", "javafx.base,javafx.controls,javafx.graphics")
    }
  }

  (run) {
    doFirst {
      jvmArgs = listOf(
        "--module-path", classpath.asPath,
        "--add-modules", "javafx.controls"
      )
    }
  }
}

The other answers show how you can use the name, type, or combination to query the container for specific tasks.

于 2018-12-01T16:14:56.337 回答