Tarea Gradle: pasar argumentos a la aplicación Java

127

Tengo una aplicación Java que se ejecuta con una tarea personalizada de gradle y la aplicación requiere algunos argumentos al ser invocada. Estos son:

programName ( string | -f filename | -d key | -h)
Options:
    string         Message to be used.
    -d key         Use default messages, key must be s[hort], m[edium] or l[ong].
    -f filename    Use specified file as input.
    -h             Help dialog.

La tarea de Gradle se ve así:

task run (type: JavaExec){
    description = "Secure algorythm testing"
    main = 'main.Test'
    classpath = sourceSets.main.runtimeClasspath
}

He intentado correr gradle run -hy no funciona.

RecuencoJones
fuente
¿Las respuestas se ajustaban a tus necesidades? Si es así, debe marcar uno como solución.
Francisco J. Lopez-Pellicer
1
En realidad no ... un amigo y yo descubrimos una forma de hacerlo, pero aún no lo tenemos claro para publicar una solución, ambas soluciones propuestas se probaron, entendimos lo que se iba a hacer, pero no lo hicimos. realmente no funciona ...
RecuencoJones
@ 6uitar6reat6od ¿Cómo lo resolvió al final? ¿También qué versión de gradle?
xlm

Respuestas:

80

Desde Gradle 4.9, los argumentos de la línea de comando se pueden pasar con --args. Por ejemplo, si desea iniciar la aplicación con argumentos de línea de comando foo --bar, puede usar

gradle run --args = 'foo --bar'

Ver también Complemento de aplicación Gradle

Cómo actualizar Gradle wrapper

AMing
fuente
1
¿Es el 'esperado o un error tipográfico? ¿Deben pasar todos los argumentos como una cadena delimitada por comillas simples?
RecuencoJones
@RecuencoJones Corregido por docs.gradle.org/current/userguide/…
Drew Stephens
1
gradle run --args = 'foo --bar'
Jim Flood
3
'foo --bar'es confuso, ¿por qué no solo usarlo 'foo bar'?
Eric Wang
44
@EricWang Estos son argumentos de línea de comandos arbitrarios que un programa puede necesitar. Es bueno mostrar que gradle admite cualquier tipo de argumento, ya que la cadena sin formato se pasa a la aplicación compilada.
Joffrey
100

Gradle 4.9+

gradle run --args='arg1 arg2'

Esto supone que su build.gradleestá configurado con el complemento de aplicación . Tu build.gradledeberías ser similar a esto:

plugins {
  // Implicitly applies Java plugin
  id: 'application'
}

application {
  // URI of your main class/application's entry point (required)
  mainClassName = 'org.gradle.sample.Main'
}

Pre-Gradle 4.9

Incluya lo siguiente en su build.gradle:

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

Luego correr: gradle run -PappArgs="['arg1', 'args2']"

xlm
fuente
77
Esta respuesta no solo fue útil, fue la más simple.
Jossie Calderon
Actualización para su actualización: gradle run --args 'arg1 arg2'no funcionó para mí. Tenía que hacer:gradle run --args='arg1 arg2'
cmyers
@cmyers gracias por atrapar eso! He actualizado mi actualización
xlm
28

Perdón por responder tan tarde.

Calculé una respuesta similar a la de @xlm:

task run (type: JavaExec, dependsOn: classes){
    if(project.hasProperty('myargs')){
        args(myargs.split(','))
    }
    description = "Secure algorythm testing"
    main = "main.Test"
    classpath = sourceSets.main.runtimeClasspath
}

E invocar como:

gradle run -Pmyargs=-d,s
RecuencoJones
fuente
28

Si desea utilizar el mismo conjunto de argumentos todo el tiempo, lo siguiente es todo lo que necesita.

run {
    args = ["--myarg1", "--myarg2"]
}
Claudio Fahey
fuente
2
Ok, para principiantes absolutos como yo: para poder definir la tarea de ejecución, su build.gradle debe contener las siguientes dos líneas: aplicar el complemento: 'application' mainClassName = "<nombre de clase completo, incluida la ruta del paquete>" De lo contrario, no puede definir el método de ejecución en buuild.gradle
mk ..
1
Estoy usando el id 'application'complemento y esta fue la respuesta que necesitaba (funciona).
Big Rich el
6

Puede encontrar la solución en Problemas al pasar propiedades y parámetros del sistema al ejecutar la clase Java a través de Gradle . Ambos implican el uso de la argspropiedad.

También debe leer la diferencia entre pasar con -Do con -Peso se explica en la documentación de Gradle

Francisco J. Lopez-Pellicer
fuente
Vi esto también. Sigue buscando. Todos estos métodos parecen querer editar / masajear las propiedades actuales y pasarlas. La línea de comandos y las propiedades de Java para ejecutar una aplicación o servicio son similares a la configuración de "Contexto" o "Configuración". Sería mejor tener un complemento que haga cosas como "ejecutar parámetros" como perfiles uno al lado del otro o algo así.
será el
5

Por supuesto, las respuestas sobre todo hacen el trabajo, pero aún así me gustaría usar algo como

gradle run path1 path2

bueno, esto no se puede hacer, pero ¿y si podemos:

gralde run --- path1 path2

Si crees que es más elegante, entonces puedes hacerlo, el truco es procesar la línea de comando y modificarla antes de que gradle lo haga, esto se puede hacer usando scripts de inicio

El guión de inicio a continuación:

  1. Procese la línea de comando y elimine --- y todos los demás argumentos después de '---'
  2. Agregue la propiedad 'appArgs' a gradle.ext

Entonces, en su tarea de ejecución (o JavaExec, Exec) puede:

if (project.gradle.hasProperty("appArgs")) {
                List<String> appArgs = project.gradle.appArgs;

                args appArgs

 }

El guión de inicio es:

import org.gradle.api.invocation.Gradle

Gradle aGradle = gradle

StartParameter startParameter = aGradle.startParameter

List tasks = startParameter.getTaskRequests();

List<String> appArgs = new ArrayList<>()

tasks.forEach {
   List<String> args = it.getArgs();


   Iterator<String> argsI = args.iterator();

   while (argsI.hasNext()) {

      String arg = argsI.next();

      // remove '---' and all that follow
      if (arg == "---") {
         argsI.remove();

         while (argsI.hasNext()) {

            arg = argsI.next();

            // and add it to appArgs
            appArgs.add(arg);

            argsI.remove();

        }
    }
}

}


   aGradle.ext.appArgs = appArgs

Limitaciones:

  1. Me vi obligado a usar '---' y no '-'
  2. Tienes que agregar un script de inicio global

Si no le gusta el guión de inicio global, puede especificarlo en la línea de comando

gradle -I init.gradle run --- f:/temp/x.xml

O mejor agregue un alias a su shell:

gradleapp run --- f:/temp/x.xml
Boaz Nahum
fuente
2
Esto funciona muy bien ... si ninguno de mis argumentos comienza con un guión. Esto hace que sea inútil para el común de los analizadores de línea de comandos :( Tan pronto como esto sucede, parece Gradle para tratar de que arg como argumento para Gradle (no creo que el. argsI.remove()Está teniendo el efecto deseado) Sugerencias.?
Krease
3

Debe pasarlos argsa la tarea utilizando las propiedades del proyecto, algo como:

args = [project.property('h')]

agregado a su definición de tarea (consulte los documentos de dsl )

Entonces puedes ejecutarlo como:

gradle -Ph run
cjstehno
fuente