【问题标题】:How to run a JavaExec gradle task with arguments when the task is called in finalizedBy?在 finalizedBy 中调用任务时,如何使用参数运行 JavaExec gradle 任务?
【发布时间】:2022-01-17 15:02:32
【问题描述】:

我创建了一个连接到数据库并进行一些检查的 JavaExec 任务。在我的 flyway build.gradle 我这样称呼任务:

flywayMigrate.finalizedBy(rootProject.checkOracleStandards)

任务运行良好,但问题是连接 url、用户和密码在连接到数据库并进行检查的程序中是硬编码的。我想将它们作为参数传递给自定义任务。

flywayMigrate后如何运行带args的自定义任务?

这是我的任务 gradle 文件的样子:

apply plugin: 'java'

dependencies {
    implementation rootProject.files("libs/check-oracle-db-standards-1.jar")

    implementation group: 'com.oracle.database.jdbc', name: 'ojdbc8', version: '21.3.0.0'
    implementation group: 'org.springframework', name: 'spring-jdbc', version: '5.3.13'
    implementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
}

task checkOracleStandards(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = 'com.package.checkoracledbstandards.Main'
}

【问题讨论】:

    标签: java gradle flyway gradle-task


    【解决方案1】:

    由于在任务之间共享/传递参数的最佳方式是通过文件,因此让任务将它们写入某处的文件,然后让您的 checkOracleStandards 任务从该文件加载它们。

    确保将参数写入 doLast 块中的文件,以避免每次 gradle 同步时都运行任务。

    最后,让您的checkOracleStandards 任务打开文件,解析参数并以某种方式使用它们。

    val outputPath = "${rootProjectPath}/build/check_params" <-- you may not want to use a folder for this
    val paramFile = file("${outputPath}/check_params")
    
     doLast {
                if (paramFile.exists().not()) {
                    paramFile.writeText()
    
                    File(outputPath)
                        .walk()
                        .maxDepth(1)
                        .filter {
                            it.isFile
                                    && it.name.endsWith("_params")
                        }
                        .forEach {
                            println("Passing params of ${it.name} into ${paramsFile.absolutePath}")
                            // PARSE params here
                            paramsFile.appendText("url: ${use_your_real_url}\tuser: ${use_your_real_user}\tpass: ${use_the_password}")
                            paramsFile.appendText("\n")
                        }
    

    如果不确定,应该让“传递参数”任务的这一部分在您的checkOracleStandards 任务之前运行,然后只需修改您的checkOracleStandards 任务以从该文件中读取参数并使用它们。

    编辑: 让我添加一些与答案本身无关的澄清 - 我会发表评论;但是 SO 改变了一些东西,我的浏览器目前无法将 cmets 留在任何地方,所以我给了你一个应该只是评论的答案。

    【讨论】:

    • 正在尝试,但我希望这样的事情能奏效:writeArgstoFile.finalizedBy "rootProject.checkOracleStandards --args=test" :D
    • 我会接受你的回答,因为我设法通过写入和读取文件来运行带有 args 的自定义任务,但不幸的是出现了问题。这就是我写入文件的方式: task writeArgstoFile { doFirst { mkdir "$rootProject.buildDir/check-db-standards" new File("${rootProject.buildDir}/check-db-standards/args").text = " ${flyway.url}\n" + "${flyway.user}\n" + "${flyway.password}\n" } } 我将始终获取写入文件中的值并且它不会更新它们以防 flyway 使用 -Dflyway.user=... 运行
    • @DinuNicolae 嘿,我的 cmets 回来了,也许我也可以帮你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多