Gradle-Aufgabe - Übergeben Sie Argumente an die Java-Anwendung


127

Ich habe eine Java-Anwendung, die mit einer benutzerdefinierten Gradle-Aufgabe ausgeführt wird, und die Anwendung benötigt beim Aufrufen einige Argumente. Diese sind:

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 sieht aus wie:

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

Ich habe versucht zu laufen gradle run -hund es funktioniert nicht.


Entsprachen die Antworten Ihren Bedürfnissen? Wenn ja, sollten Sie eine als Lösung markieren.
Francisco J. Lopez-Pellicer

1
Nicht wirklich ... ein Freund und ich haben einen Weg gefunden, dies zu tun, aber wir haben noch keinen klaren Weg, um eine Lösung zu veröffentlichen. Beide Lösungsvorschläge wurden ausprobiert. Wir haben verstanden, was zu tun ist, haben es aber nicht getan. Es scheint nicht wirklich zu funktionieren ...
RecuencoJones

@ 6uitar6reat6od Wie haben Sie es am Ende gelöst? Auch welche Version von Gradle?
xlm

Antworten:


80

Seit Gradle 4.9 können die Befehlszeilenargumente mit --args übergeben werden. Wenn Sie die Anwendung beispielsweise mit Befehlszeilenargumenten starten möchten foo --bar, können Sie sie verwenden

gradle run --args = 'foo --bar'

Siehe auch Gradle Application Plugin

So aktualisieren Sie Gradle Wrapper


1
Ist das 'erwartet oder ein Tippfehler? Sollten alle Argumente als durch einfache Anführungszeichen getrennte Zeichenfolge übergeben werden?
RecuencoJones


1
gradle run --args = 'foo --bar'
Jim Flood

3
'foo --bar'ist verwirrend, warum nicht einfach verwenden 'foo bar'.
Eric Wang

4
@EricWang Dies sind beliebige Befehlszeilenargumente, die ein Programm möglicherweise benötigt. Es ist schön zu zeigen, dass gradle jede Art von Argumenten unterstützt, da die Rohzeichenfolge an die erstellte Anwendung übergeben wird.
Joffrey

100

Gradle 4.9+

gradle run --args='arg1 arg2'

Dies setzt voraus, dass Sie build.gradlemit dem Anwendungs-Plugin konfiguriert sind . Sie build.gradlesollten ungefähr so ​​aussehen:

plugins {
  // Implicitly applies Java plugin
  id: 'application'
}

application {
  // URI of your main class/application's entry point (required)
  mainClassName = 'org.gradle.sample.Main'
}

Pre-Gradle 4.9

Nehmen Sie Folgendes in Ihre auf build.gradle:

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

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


7
Diese Antwort war nicht nur hilfreich, sondern auch die einfachste.
Jossie Calderon

Update für Ihr Update: gradle run --args 'arg1 arg2'Hat bei mir nicht funktioniert. Ich musste tun:gradle run --args='arg1 arg2'
cmyers

@cmyers danke, dass du das verstanden hast! Ich habe mein Update aktualisiert
xlm

28

Tut mir leid, dass ich so spät geantwortet habe.

Ich fand eine Antwort ähnlich wie bei @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
}

Und rufen Sie auf wie:

gradle run -Pmyargs=-d,s

28

Wenn Sie immer die gleichen Argumente verwenden möchten, benötigen Sie nur Folgendes.

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

2
Ok, für absolute Anfänger wie mich: Um die Ausführungsaufgabe definieren zu können, sollte Ihr build.gradle die folgenden zwei Zeilen enthalten: Apply-Plugin: 'application' mainClassName = "<vollständiger Klassenname einschließlich des Paketpfads>" Andernfalls können Sie nicht definieren die Ausführungsmethode in der buuild.gradle
mk ..

1
Ich benutze das id 'application'Plugin und dies war die Antwort, die ich brauchte (es funktioniert).
Big Rich

6

Die Lösung finden Sie unter Probleme beim Übergeben von Systemeigenschaften und -parametern beim Ausführen der Java-Klasse über Gradle . Beide beinhalten die Nutzung der argsImmobilie

Außerdem sollten Sie den Unterschied zwischen dem Bestehen mit -Doder mit -Pdem lesen, der in der Gradle-Dokumentation erläutert wird


Hab das auch gesehen. Immer noch suchend. Alle diese Methoden scheinen die aktuellen Eigenschaften bearbeiten / massieren und weitergeben zu wollen. 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 "Parameter ausführen" als Side-by-Side-Profile oder so etwas ausführt.
wird

5

Natürlich machen die Antworten vor allem den Job, aber trotzdem würde ich gerne so etwas verwenden

gradle run path1 path2

Nun, das geht nicht, aber was ist, wenn wir können:

gralde run --- path1 path2

Wenn Sie der Meinung sind, dass es eleganter ist, können Sie es tun. Der Trick besteht darin, die Befehlszeile zu verarbeiten und zu ändern, bevor gradle dies tut. Dies kann mithilfe von Init-Skripten erfolgen

Das Init-Skript unten:

  1. Verarbeiten Sie die Befehlszeile und entfernen Sie --- und alle anderen Argumente nach '---'
  2. Fügen Sie gradle.ext die Eigenschaft 'appArgs' hinzu

In Ihrer Ausführungsaufgabe (oder JavaExec, Exec) können Sie also:

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

                args appArgs

 }

Das Init-Skript lautet:

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, '---' und nicht '-' zu verwenden.
  2. Sie müssen ein globales Init-Skript hinzufügen

Wenn Ihnen das globale Init-Skript nicht gefällt, können Sie es in der Befehlszeile angeben

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

Oder fügen Sie Ihrer Shell besser einen Alias ​​hinzu:

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

2
Das funktioniert großartig ... wenn keines meiner Argumente mit einem Bindestrich beginnt. Dies macht es für gängige Befehlszeilen-Parser nutzlos :(. Sobald dies geschieht, scheint gradle dieses Argument als Argument für gradle zu behandeln (ich glaube nicht, dass das argsI.remove()den gewünschten Effekt hat). Vorschläge?
Krease

3

Sie müssen sie argsmithilfe von Projekteigenschaften an die Aufgabe übergeben, z. B.:

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

zu Ihrer Aufgabendefinition hinzugefügt (siehe dsl-Dokumente )

Dann können Sie es ausführen als:

gradle -Ph run
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.