J'ai une application Java qui s'exécute avec une tâche de gradation personnalisée et l'application nécessite des arguments lors de son appel. Ceux-ci sont:
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 tâche Gradle ressemble à:
task run (type: JavaExec){
description = "Secure algorythm testing"
main = 'main.Test'
classpath = sourceSets.main.runtimeClasspath
}
J'ai essayé de lancer gradle run -h
et cela ne fonctionne pas.
Depuis Gradle 4.9, les arguments de ligne de commande peuvent être passés avec --args. Par exemple, si vous souhaitez lancer l'application avec les arguments de ligne de commande foo --bar
, vous pouvez utiliser
gradle run --args = 'foo --bar'
Mise à jour:
Gradle 4.9 fournit un meilleur support pour passer des arguments en ligne de commande, par exemple:
gradle run --args='arg1 arg2'
Pré-Gradient 4.9, ajoutez ce qui suit à build.gradle
:
run {
if (project.hasProperty("appArgs")) {
args Eval.me(appArgs)
}
}
Ensuite, pour lancer: gradle run -PappArgs="['arg1', 'args2']"
Désolé de répondre si tard.
J'ai pensé répondre de la même manière à @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
}
Et invoquer comme:
gradle run -Pmyargs=-d,s
Si vous souhaitez utiliser le même jeu d'arguments tout le temps, vous avez besoin de ce qui suit.
run {
args = ["--myarg1", "--myarg2"]
}
Vous pouvez trouver la solution dans Problèmes de transmission des propriétés système et des paramètres lors de l'exécution de Java class via Gradle . Les deux impliquent l'utilisation de la propriété args
Aussi, vous devriez lire la différence entre transmettre avec -D
ou avec -P
, ce qui est expliqué dans la documentation Gradle
Bien sûr, les réponses font avant tout le travail, mais je voudrais quand même utiliser quelque chose comme
gradle run path1 path2
eh bien, cela ne peut pas être fait, mais si nous pouvions:
gralde run --- path1 path2
Si vous pensez que c'est plus élégant, alors vous pouvez le faire, l'astuce est de traiter la ligne de commande et de la modifier avant que Gradle ne le fasse, vous pouvez le faire en utilisant scripts d'initiation
Le script init ci-dessous:
Ainsi, dans votre tâche d'exécution (ou JavaExec, Exec), vous pouvez:
if (project.gradle.hasProperty("appArgs")) {
List<String> appArgs = project.gradle.appArgs;
args appArgs
}
Le script init est:
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
Limites:
Si vous n'aimez pas le script d'initialisation global, vous pouvez le spécifier en ligne de commande
gradle -I init.gradle run --- f:/temp/x.xml
Ou mieux, ajoutez un alias à votre shell:
gradleapp run --- f:/temp/x.xml
Vous devez les transmettre en tant que args
à la tâche à l'aide des propriétés du projet, par exemple:
args = [project.property('h')]
ajouté à votre définition de tâche (voir le dsl docs )
Ensuite, vous pouvez l'exécuter comme:
gradle -Ph run