Gradle tâche-passer les arguments à L'application Java

j'ai une application Java qui fonctionne avec une tâche gradle personnalisée et l'application nécessite quelques arguments lors de l'invocation. Ce 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.

tâche Gradle ressemble à:

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

j'ai essayé de courir gradle run -h et ça ne marche pas.

62
demandé sur xlm 2014-12-22 17:06:57

7 réponses

depuis Gradle 4.9, les arguments en ligne de commande peuvent être passés avec --args. Par exemple, si vous voulez lancer l'application avec les arguments en ligne de commande foo --bar , vous pouvez utiliser

gradle exécuter --args='foo-bar'

Voir Aussi Application Grad Plugin

comment mettre à niveau Gradle wrapper

13
répondu AMing 2018-10-02 17:33:56

mise à jour:

Gradle 4.9 fournit un meilleur support pour passer des arguments de ligne de commande, par exemple:

gradle run --args 'arg1 arg2'

pré-Grade 4.9, ajouter ce qui suit à build.gradle :

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

puis exécuter: gradle run -PappArgs="['arg1', 'args2']"

64
répondu xlm 2018-08-21 04:33:08

Désolé d'avoir répondu si tard.

j'ai trouvé une réponse identique à celle 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
}

et invoquer comme:

gradle run -Pmyargs=-d,s
24
répondu RecuencoJones 2015-04-01 15:41:52

Si vous voulez utiliser le même ensemble d'arguments tout le temps, la suite est tout ce dont vous avez besoin.

run {
    args = ["--myarg1", "--myarg2"]
}
13
répondu Claudio Fahey 2017-04-23 02:54:28

vous pouvez trouver la solution dans problèmes passant les propriétés et les paramètres du système lors de L'exécution de classe Java via Gradle . Tous deux impliquent l'utilisation du args bien

aussi, vous devriez lire la différence entre passer avec -D ou avec -P qui est expliqué dans la documentation Gradle

7
répondu Francisco J. Lopez-Pellicer 2017-05-23 11:54:44

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 que faire si nous le pouvons:

gralde run --- path1 path2

si vous pensez qu'il est plus élégant, alors vous pouvez le faire, l'astuce est de traiter la ligne de commande et de la modifier avant gradle Ne, ce qui peut être fait en utilisant INIT scripts

Le script d'initialisation ci-dessous:

  1. Processus de la ligne de commande et retirez --- et tous les autres arguments suivants '---'
  2. ajouter propriété 'appArgs' à gradle.poste 1519180920"

ainsi dans votre tâche de course (ou JavaExec, Exec) vous pouvez:

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

                args appArgs

 }

Le script d'initialisation est la suivante:

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

Limitations:

  1. j'ai été forcé d'utiliser '---' et non pas '--'
  2. You il faut ajouter un script init global

si vous n'aimez pas global init script, vous pouvez le spécifier en ligne de commande

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

ou mieux ajouter un alias à votre shell:

gradleapp run --- f:/temp/x.xml
4
répondu Boaz Nahum 2017-08-22 08:03:49

vous devez les passer comme args à la tâche en utilisant les propriétés du projet, quelque chose comme:

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

ajouté à la définition de votre tâche (voir la dsl docs )

alors vous pouvez l'exécuter comme:

gradle -Ph run
0
répondu cjstehno 2014-12-22 14:19:51