首页 > 解决方案 > Gradle 在自定义运行任务中创建参数

问题描述

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

我正在尝试创建多个自定义任务,从应用程序插件中包装 Gradle“运行”,根据自定义任务的需要在其中创建一个或多个参数。我不想从 CLI* 传递参数,我希望在运行包装 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 就会开始寻找一个罐子,想不出办法。第一个选项(customA 任务)不会在 main 的 args 列表中提供参数,但我想它可以通过不满足我的要求的 getProperty() 访问。

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

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

标签: javakotlingradlebuild

解决方案


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

主.kt

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

build.gradle.kts科特林 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)
    }
}

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

执行 输出
./gradlew customA [Hello, World!]
./gradlew customB [Goodbye, World!]

推荐阅读