web-dev-qa-db-fra.com

Tâche Gradle - Passer les arguments à l'application Java

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.

96
RecuencoJones

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'

Voir aussi Gradle Application Plugin

Comment mettre à jour Gradle wrapper

47
AMing

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']"

89
xlm

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
27
RecuencoJones

Si vous souhaitez utiliser le même jeu d'arguments tout le temps, vous avez besoin de ce qui suit.

run {
    args = ["--myarg1", "--myarg2"]
}
20
Claudio Fahey

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:

  1. Traite la ligne de commande et supprime --- ainsi que tous les autres arguments après '---'
  2. Ajouter la propriété 'appArgs' à gradle.ext

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:

  1. J'ai été obligé d'utiliser '---' et non '-'
  2. Vous devez ajouter un script d'initialisation global

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
5
Boaz Nahum

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
2
cjstehno