2012-07-27 41 views
68

Estoy tratando de pasar un argumento desde la línea de comandos a una clase java. Seguí esta publicación: http://gradle.1045684.n5.nabble.com/Gradle-application-plugin-question-td5539555.html pero el código no funciona para mí (¿quizás no es para JavaExec?). Esto es lo que he intentado:Cómo pasar argumentos desde la línea de comandos a gradle

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 argumentos anteriormente codificado 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 cambie el código para utilizar la sección hasProperty y pasar "demo" como una argumento en la línea de comandos, aparece un 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 simple prueba 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 

añadí la siguiente asignación antes de la definición de la tarea, pero no cambió el resultado:

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

Cualquier punteros sobre cómo pasar la línea de comandos argumentos para gradle apreciados.

Respuesta

41

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

+3

Gracias por avisarme! Cambiar el nombre a testngGroup solucionó el problema. Se encontró una lista de propiedades predefinidas en la tabla 13.1 en http://gradle.org/docs/current/userguide/writing_build_scripts.html. – Lidia

+0

Solo para actualizar el enlace: https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_properties_and_system_properties – Kikiwa

43

Basándose en la respuesta de Peter N, este es un ejemplo de cómo agregar argumentos (opcionales) especificados por el usuario para pasarlos a Java principal para una tarea JavaExec (ya que no puede establecer manualmente la propiedad 'args' por el motivo él cita)

añadir esto a la tarea:.

task(runProgram, type: JavaExec) { 

    [...] 

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

... y correr en la línea de comando como este

% ./gradlew runProgram '-Pmyargs=-x,7,--no-kidding,/Users/rogers/tests/file.txt' 
+1

¿Cómo podría tener parámetros separados? E.g: 'gradle run -Purl = 'localhost', -Pport = '8080 ', -Pnombre de usuario =' admin '' ¿cómo se vería mi código en build.gradle? – Tomas

+0

@Tomas Sugiero dar forma a una pregunta de alto nivel para eso. (No conozco esa situación lo suficientemente bien para dar una respuesta rápida en línea aquí, de todos modos.) –

+1

No se preocupe, ya lo hizo y se solucionó [aquí] (http://stackoverflow.com/questions/34875637/how -to-pass-multiple-parameters-in-command-line-when-running-gradle-task) – Tomas

21

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 terminal:

gradle run -PappArgsWhatEverIWant="['localhost','8080']" 
-2

utilizar una URL desde la línea de comandos mantener su URL en el archivo Gradle aplicación de la siguiente manera resValue "cadena" , "url", CommonUrl

y dar un pa rameter en gradle.archivos de propiedades de la siguiente manera commonURL = "poner su URL aquí o puede estar vacío"

y pasar un comando de línea de comandos de la siguiente manera Gradle assembleRelease -Pcommanurl = poner su URL aquí

0

I ha 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 de la línea de comandos se ejecuta este:

gradle runProgram -PcommandLineArgs="arg1 arg2 arg3 arg4"  
Cuestiones relacionadas