recibir - Tarea Gradle: pasar argumentos a la aplicación Java
recibir parametros en java (7)
Desde Gradle 4.9, los argumentos de la línea de comandos se pueden pasar con --args. Por ejemplo, si desea iniciar la aplicación con argumentos de línea de comandos foo --bar
, puede usar
gradle run --args ''foo --bar
Tengo una aplicación Java que se ejecuta con una tarea gradle personalizada 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 ejecutar gradle run -h
y no funciona.
Perdón por responder tan tarde.
Pensé que 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
Por supuesto, las respuestas sobre todo hacen el trabajo, pero aún así me gustaría usar algo así 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 lo haga gradle, esto se puede hacer usando scripts de init.
El script de inicio a continuación:
- Procesar la línea de comando y eliminar --- y todos los demás argumentos que siguen a ''---''
- Agregar propiedad ''appArgs'' a gradle.ext
Entonces en tu tarea de ejecución (o JavaExec, Exec) puedes:
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
- Me vi obligado a usar ''---'' y no ''-''
- Tienes que agregar un script de inicio global
Si no te gusta el script de inicio global, puedes especificarlo en la línea de comando
gradle -I init.gradle run --- f:/temp/x.xml
O mejor, agrega un alias a tu caparazón:
gradleapp run --- f:/temp/x.xml
Puede encontrar la solución en Problemas pasando propiedades y parámetros del sistema cuando ejecuta clases Java a través de Gradle . Ambos implican el uso de la propiedad args
También debe leer la diferencia entre pasar con -D
o con -P
que se explica en la documentación de Gradle
Si desea utilizar el mismo conjunto de argumentos todo el tiempo, lo siguiente es todo lo que necesita.
run {
args = ["--myarg1", "--myarg2"]
}
Tuve el mismo problema y logré resolverlo agregando lo siguiente a build.gradle
:
run {
if (project.hasProperty("appArgs")) {
args Eval.me(appArgs)
}
}
Luego para ejecutar: gradle run -PappArgs="[''arg1'', ''args2'']"
args
pasarlos como args
a la tarea utilizando las propiedades del proyecto, algo así como:
args = [project.property(''h'')]
agregado a su definición de tarea (vea los documentos dsl )
Entonces puedes ejecutarlo como:
gradle -Ph run