2014-12-22 1 views
45

Ich habe eine Java-Anwendung, die mit einer benutzerdefinierten Taskgrelle ausgeführt wird und die Anwendung erfordert einige Argumente beim Aufrufen. Diese sind:Gradle Task - übergeben Sie Argumente an Java-Anwendung

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. 

Gradle Aufgabe wie folgt aussieht:

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

Ich habe versucht, läuft gradle run -h und es funktioniert nicht.

+0

Passten die Antworten zu Ihren Bedürfnissen? Wenn ja, solltest du eins als Lösung markieren. –

+1

Nicht wirklich ... ein Freund und ich einen Weg, es zu tun, aber wir haben es noch nicht klar, um eine Lösung zu veröffentlichen, beide vorgeschlagenen Lösungen wurden ausprobiert, wir verstanden, was es getan werden würde, aber didn Es scheint wirklich zu funktionieren ... – RecuencoJones

+0

@ 6uitar6reat6od Wie hast du es am Ende gelöst? Auch welche Version von Gradle? – xlm

Antwort

21

es tut uns so spät zu beantworten.

Ich dachte, eine Antwort gleichermaßen @xlm ‚s:

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

und rufen wie:

gradle run -Pmyargs=-d,s 
0

Sie müssen sie als args, um die Aufgabe zu übergeben Projekteigenschaften verwenden, so etwas wie:

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

zu Ihrer Aufgabendefinition hinzugefügt (siehe dsl docs)

Dann können Sie es als ausführen können:

gradle -Ph run 
6

Sie können die Lösung in Problems passing system properties and parameters when running Java class via Gradle finden. Beide beinhalten die Verwendung der args Eigenschaft

Auch sollten Sie den Unterschied zwischen vorbei mit -D oder mit -P lesen, den in the Gradle documentation

+0

Sah das auch. Immer noch suchend. Alle diese Methoden scheinen die aktuellen Eigenschaften bearbeiten/massieren zu wollen und sie weiterzugeben. Befehlszeilen- und Java-Eigenschaften zum Ausführen einer Anwendung oder eines Dienstes entsprechen der Einstellung "Kontext" oder "Konfiguration". Es wäre besser, ein Plug-in zu haben, das Dinge wie "run parameters" als Side-by-Side-Profile oder so etwas macht. – will

47

erklärte ich hatte das gleiche Problem und schaffte es zu lösen, indem die folgenden build.gradle fügen hinzu:

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

Dann zu laufen: gradle run -PappArgs="['arg1', 'args2']"

+4

Diese Antwort war nicht nur hilfreich, sie war die einfachste. –

8

Wenn Sie den gleichen Satz von Argumenten verwenden möchten, die ganze Zeit, die folgende ist alles was du brauchst.

run { 
    args = ["--myarg1", "--myarg2"] 
} 
4

Natürlich sind die Antworten vor allem die Arbeit machen, aber immer noch würde Ich mag etwas verwenden, wie

gradle run path1 path2 

auch dies kann nicht getan werden, aber was ist, wenn wir können:

gralde run --- path1 path2 

Wenn Sie denken, es ist eleganter, dann können Sie es tun, der Trick, um die Befehlszeile zu verarbeiten ist und ändern Sie es vor gradle der Fall ist, kann dies durch Verwendung init scripts

erfolgen

Das Init-Skript unter:

  1. Prozess der Befehlszeile, und entfernen Sie --- und alle anderen Argumente folgenden '---'
  2. Eigenschaft hinzufügen 'appArgs' Gradle.ext

So in Ihrer Lauf Aufgabe (oder JavaExec, Exec) können Sie:

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

       args appArgs 

} 

Das Init-Skript ist:

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 

Einschränkungen:

  1. Ich war gezwungen zu verwenden '---' und nicht '-'
  2. Sie haben Einige globale Init-Skript

hinzufügen Wenn Sie globale Init-Skript nicht gefällt, können Sie es in der Befehlszeile

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

Oder besser geben Sie einen Alias ​​zu Ihrer Shell hinzu:

gradleapp run --- f:/temp/x.xml 
+1

Das funktioniert super ... wenn keines meiner Argumente mit einem Bindestrich beginnt. Dies macht es für gängige [Kommandozeilen-Parser] (https://commons.apache.org/proper/common-cli/usage.html) unbrauchbar :(. Sobald das passiert, scheint Gradle dieses arg als Argument zu behandeln (Ich glaube nicht, dass die 'argsI.remove()' den gewünschten Effekt hat.) Vorschläge? – Krease