首页 > 解决方案 > Kotlin dsl gradle,如何使用自定义任务调用和执行 .kt 内的函数

问题描述

我有和应用程序有

fun main() {} 

在 test/kotlin/com.company/LocalApplication.kt 里面

我使用它在 localhost 中运行,例如使用 IntelliJ 我只需单击运行该功能即可启动我的应用程序。

里面的那个函数是什么测试它为localhost生成一个自定义的args配置,然后调用真正的main/com.company/Application.kt

所以我想在 build.gradle.kts 中为 kotlin dsl gradle 创建一个任务,它与 Intellij 在我手动单击那个有趣的 main() 上运行时所做的完全相同

例如在终端这样做:

gradle localhost

并且该命令调用 test/kotlin/com.company/LocalApplication.kt 中的 fun main() {} 并使用 localhost 配置启动我的应用程序。

多谢你们

标签: javagradlekotlindsl

解决方案


让我们假设这个非常基本的应用程序App.kt

package com.company

class App {
    val greeting: String
        get() {
            return "Hello world."
        }
}

fun main(args: Array<String>) {
    println(App().greeting)
}

您可以使用JavaExec任务类型。

定义类型的自定义任务JavaExec

tasks.register<JavaExec>("localhost") {
    classpath = sourceSets.test.get().runtimeClasspath
    main = "com.company.LocalApplication"
}

然后,您需要更新您LocalApplication.kt的使用@file:JvmName

@file:JvmName("LocalApplication")
package com.company

fun main(args: Array<String>) {
    println(App().greeting)
}

然后在我的终端中运行任务会产生:

$ ./gradlew localhost

> Task :localhost
Hello world.

BUILD SUCCESSFUL in 4s
3 actionable tasks: 3 executed

该任务还有更多选项JavaExec,请阅读文档以获取更多信息。

经测试:

------------------------------------------------------------
Gradle 6.1.1
------------------------------------------------------------

Build time:   2020-01-24 22:30:24 UTC
Revision:     a8c3750babb99d1894378073499d6716a1a1fa5d

Kotlin:       1.3.61
Groovy:       2.5.8
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          11.0.6 (AdoptOpenJDK 11.0.6+10)
OS:           Mac OS X 10.15.3 x86_64

推荐阅读