Cómo pasar argumentos desde la línea de comandos a gradle

105

Estoy tratando de pasar un argumento de la línea de comando a una clase de Java. Seguí esta publicación: http://gradle.1045684.n5.nabble.com/Gradle-application-plugin-question-td5539555.html pero el código no me funciona (¿quizás no es para JavaExec?). Esto es lo que probé:

task listTests(type:JavaExec){
    main = "util.TestGroupScanner"
    classpath = sourceSets.util.runtimeClasspath
    // this works...
    args 'demo'
    /*
    // this does not work!
    if (project.hasProperty("group")){
        args group
    }
    */
}

La salida del valor de argumentos codificados anteriormente es:

C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle>g listTests
:compileUtilJava UP-TO-DATE
:processUtilResources UP-TO-DATE
:utilClasses UP-TO-DATE
:listTests
Received argument: demo

BUILD SUCCESSFUL

Total time: 13.422 secs

Sin embargo, una vez que cambio el código para usar la sección hasProperty y paso "demo" como argumento en la línea de comando, obtengo una NullPointerException:

C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle>g listTests -Pgroup=demo -s

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle\build.gradle' line:25

* What went wrong:
A problem occurred evaluating root project 'testgradle'.
> java.lang.NullPointerException (no error message)

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.GradleScriptException: A problem occurred evaluating root project
 'testgradle'.
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:54)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:127)
    at org.gradle.configuration.BuildScriptProcessor.evaluate(BuildScriptProcessor.java:38) 

Hay un proyecto de prueba simple disponible en http://gradle.1045684.n5.nabble.com/file/n5709919/testgradle.zip que ilustra el problema.

Esto está usando Gradle 1.0-rc-3. El NullPointer es de esta línea de código:

args group 

Agregué la siguiente asignación antes de la definición de la tarea, pero no cambió el resultado:

group = hasProperty('group') ? group : 'nosuchgroup' 

Se agradece cualquier sugerencia sobre cómo pasar argumentos de línea de comando a gradle.

Lidia
fuente
TNX mucho @Joshua Goldberg. muestra para un argumento: stackoverflow.com/a/58202665/2201814
MHSFisher

Respuestas:

63

project.groupes una propiedad predefinida. Con -P, solo puede establecer propiedades del proyecto que no estén predefinidas. Alternativamente, puede configurar las propiedades del sistema Java ( -D).

Peter Niederwieser
fuente
3
¡Gracias por hacérmelo saber! Cambiar el nombre a testngGroup solucionó el problema. Encontré una lista de propiedades predefinidas en la tabla 13.1 en gradle.org/docs/current/userguide/writing_build_scripts.html .
Lidia
2
Solo para actualizar el enlace: docs.gradle.org/current/userguide/…
Kikiwa
56

Sobre la base de la respuesta de Peter N, este es un ejemplo de cómo agregar argumentos (opcionales) especificados por el usuario para pasar a Java main para una tarea JavaExec (ya que no puede establecer la propiedad 'args' manualmente por la razón que él cita).

Agregue esto a la tarea:

task(runProgram, type: JavaExec) {

  [...]

  if (project.hasProperty('myargs')) {
      args(myargs.split(','))
  }

... y ejecutar en la línea de comando así

% ./gradlew runProgram '-Pmyargs=-x,7,--no-kidding,/Users/rogers/tests/file.txt'
Joshua Goldberg
fuente
2
¿Cómo podría tener parámetros separados? Por ejemplo: gradle run -Purl='localhost', -Pport='8080', -Pusername='admin' ¿cómo debería verse mi código en build.gradle?
Tomas
@Tomas Sugeriría desarrollar una pregunta de alto nivel para eso. (No conozco esa situación lo suficientemente bien como para dar una respuesta rápida en línea aquí, de todos modos.)
Joshua Goldberg
1
No se preocupe, ya lo hice y lo solucioné aquí
Tomas
28

Mi programa con dos argumentos, args [0] y args [1]:

public static void main(String[] args) throws Exception {
    System.out.println(args);
    String host = args[0];
    System.out.println(host);
    int port = Integer.parseInt(args[1]);

mi build.gradle

run {
    if ( project.hasProperty("appArgsWhatEverIWant") ) {
        args Eval.me(appArgsWhatEverIWant)
    }
}

mi mensaje de terminal:

gradle run  -PappArgsWhatEverIWant="['localhost','8080']"
Oscar Raig Colón
fuente
17

A partir de Gradle 4.9, el complemento de la aplicación comprende la --argsopción, por lo que pasar los argumentos es tan simple como:

build.gradle

plugins {
    id 'application'
}

mainClassName = "my.App"

src / main / java / my / App.java

public class App {
    public static void main(String[] args) {
        System.out.println(args);
    }
}

intento

./gradlew run --args='This string will be passed into my.App#main arguments'
loco
fuente
15

Es posible utilizar opciones de línea de comandos personalizadas en Gradle para terminar con algo como:

./gradlew printPet --pet="puppies!"

Sin embargo, las opciones de línea de comandos personalizadas en Gradle son una función de incubación .

Solución Java

Para terminar con algo como esto, siga las instrucciones aquí :

import org.gradle.api.tasks.options.Option;

public class PrintPet extends DefaultTask {
    private String pet;

    @Option(option = "pet", description = "Name of the cute pet you would like to print out!")
    public void setPet(String pet) {
        this.pet = pet;
    }

    @Input
    public String getPet() {
        return pet;
    }

    @TaskAction
    public void print() {
        getLogger().quiet("'{}' are awesome!", pet);
    }
}

Entonces regístrelo:

task printPet(type: PrintPet)

Ahora puedes hacer:

./gradlew printPet --pet="puppies"

salida:

Cachorros! ¡son asombrosos!

Solución de Kotlin

open class PrintPet : DefaultTask() {

    @Suppress("UnstableApiUsage")
    @set:Option(option = "pet", description = "The cute pet you would like to print out")
    @get:Input
    var pet: String = ""

    @TaskAction
    fun print() {    
        println("$pet are awesome!")
    }
}

luego registre la tarea con:

tasks.register<PrintPet>("printPet")
David Rawson
fuente
5

Si necesita verificar y establecer un argumento , su build.gradlearchivo sería así:

....

def coverageThreshold = 0.15

if (project.hasProperty('threshold')) {
    coverageThreshold = project.property('threshold').toString().toBigDecimal()
}

//print the value of variable
println("Coverage Threshold: $coverageThreshold")
...

Y el comando de muestra en Windows:

prueba de limpieza de Gradlew -Pthreshold = 0.25

MHSFisher
fuente
4

He escrito un fragmento de código que coloca los argumentos de la línea de comando en el formato que espera gradle.

// this method creates a command line arguments
def setCommandLineArguments(commandLineArgs) {
    // remove spaces 
    def arguments = commandLineArgs.tokenize()

            // create a string that can be used by Eval 
            def cla = "["
            // go through the list to get each argument
            arguments.each {
                    cla += "'" + "${it}" + "',"
            }

    // remove last "," add "]" and set the args 
    return cla.substring(0, cla.lastIndexOf(',')) + "]"
}

mi tarea se ve así:

task runProgram(type: JavaExec) {
    if ( project.hasProperty("commandLineArgs") ) {
            args Eval.me( setCommandLineArguments(commandLineArgs) )
    }
}

Para pasar los argumentos desde la línea de comando, ejecute esto:

gradle runProgram -PcommandLineArgs="arg1 arg2 arg3 arg4"    
Sebastián Musial
fuente
1

Aquí hay un gran ejemplo:

https://kb.novaordis.com/index.php/Gradle_Pass_Configuration_on_Command_Line

Qué detalles puede pasar los parámetros y luego proporcionar un valor predeterminado en una variable ext así:

gradle -Dmy_app.color=blue

y luego hacer referencia en Gradle como:

ext {
   color = System.getProperty("my_app.color", "red");
}

Y luego, en cualquier lugar del script de compilación, puede hacer referencia a él como curso en cualquier lugar donde pueda hacer referencia a él como project.ext.color

Más consejos aquí: https://kb.novaordis.com/index.php/Gradle_Variables_and_Properties

Matt Wolfe
fuente
-4

pasar una url desde la línea de comando mantenga su url en el archivo gradle de la aplicación de la siguiente manera resValue "cadena", "url", CommonUrl

y proporcione un parámetro en los archivos gradle.properties de la siguiente manera CommonUrl = "ponga su url aquí o puede estar vacía"

y pase un comando desde la línea de comandos de la siguiente manera: gradle assembleRelease -Pcommanurl = ponga su URL aquí

Arun Kawdiya
fuente