Gradle 在自定义 运行 任务中创建参数

Gradle create args in custom run tasks

我是 Gradle 的新手,我肯定遗漏了一些东西,但这个基本问题对我来说还是个谜。

我正在尝试创建多个自定义任务,将 Gradle 'run' 从应用程序插件中包装起来,其中根据自定义任务的需要在其中创建一个或多个参数。 我不想从 CLI* 传递参数,我希望在 运行-wrapping Gradle 任务中创建这些参数。

让我们看一下我正在努力实现的目标的使用示例:

// Main.kt
fun main(args: Array<String>) {
   for (a in args)
      println("$a ") // prints 'env1' or 'env2 5' (see gradle.build)
}

// gradle.build, unworking attempt 1
gradle.registerTask("customA") {
   description = "run wrapper 1"

   doFirst {
     gradle.run.configure {
        systemProperty("-Dtask", "env1")
     }
   }
   finalizedBy("run") 
}

// gradle.build, unworking attempt 2
gradle.registerTask("customB") {
   description = "run wrapper 2"
   args = listOf("env2", "5")

   finalizedBy("run") 
}

// Then use as
./gradlew customA

// Essentially I want the above command to be equal to ./gradlew run --args=['env2', '5']

该程序不是 Spring Boot,它是一个小的 kotlin 项目。因此,我希望它 运行 作为一个程序,而不是一个 jar。不幸的是,每当我使用 'args' 属性,Gradle 开始寻找一个 jar,想不出办法解决它。 第一个选项(customA 任务)没有在 main 的 args 列表中提供参数,但我想它可以通过 getProperty() 访问,这不满足我的要求。

你能告诉我做我想做的事情的正确方法吗?

* 有很多关于如何做到这一点的话题

您的第一次尝试是设置系统 属性,而不是应用程序参数。您的第二次尝试是设置 customB 任务的参数,而不是 run 任务的参数。对于您想要的可能有更好的方法,但以下方法似乎有效:

Main.kt

fun main(args: Array<String>) = println(args.contentToString())

build.gradle.kts (Kotlin DSL):

plugins {
    kotlin("jvm") version "1.5.20"
    application
}

application {
    mainClass.set("MainKt")
}

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib"))
}

tasks {
    val run by existing(JavaExec::class)

    register("customA") {
        doFirst {
            run.configure {
                args = listOf("Hello", "World!")
            }
        }
        finalizedBy(run)
    }

    register("customB") {
        doFirst {
            run.configure {
                args = listOf("Goodbye", "World!")
            }
        }
        finalizedBy(run)
    }
}

通过以上我得到以下输出:

Executing Output
./gradlew customA [Hello, World!]
./gradlew customB [Goodbye, World!]