简体   繁体   中英

How to run a JavaExec gradle task with arguments when the task is called in finalizedBy?

I created a JavaExec task that connects to a db and does some checks. In my flyway build.gradle I call the task like this:

flywayMigrate.finalizedBy(rootProject.checkOracleStandards)

The task works fine, but the problem is that the connection url, user and password are hardcoded in the program that connects to the db and does the checks. I want to pass them as args to the custom task.

How to run the custom task with args after flywayMigrate?

This is how my task gradle file looks like:

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'
}

Since the best way to share/pass arguments between tasks is through files, have a task write them to a file somewhere, and then have your checkOracleStandards task load them from that file.

Make sure the arguments are written to the file in the doLast block, to avoid having the task run every time gradle syncs for example.

Finally, have your checkOracleStandards task open up the file, parse the parameters and use them somehow.

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")
                    }

if unsure, should make this part of a "pass params" task to run before your checkOracleStandards task, and then just modify your checkOracleStandards task to read params from this file and use them.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM