Zadanie Gradle - przekazuje argumenty do aplikacji Java

127

Mam aplikację Java, która działa z niestandardowym zadaniem gradle i aplikacja wymaga pewnych argumentów po wywołaniu. To są:

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.

Zadanie Gradle wygląda następująco:

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

Próbowałem biegać gradle run -hi to nie działa.

RecuencoJones
źródło
Czy odpowiedzi odpowiadały Twoim potrzebom? Jeśli tak, należy oznaczyć je jako rozwiązanie.
Francisco J. Lopez-Pellicer,
1
Niezupełnie ... z przyjacielem odkryliśmy sposób, aby to zrobić, ale nie mamy jeszcze jasnego, aby opublikować rozwiązanie, wypróbowano oba proponowane rozwiązania, zrozumieliśmy, co należy zrobić, ale nie zrobiliśmy Wydaje się, że naprawdę działa ...
RecuencoJones,
@ 6uitar6reat6od Jak ostatecznie rozwiązałeś ten problem? Jaka wersja gradle?
xlm

Odpowiedzi:

80

Od wersji Gradle 4.9 argumenty wiersza poleceń można przekazywać za pomocą --args. Na przykład, jeśli chcesz uruchomić aplikację z argumentami wiersza poleceń foo --bar, możesz użyć

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

Zobacz także Wtyczka aplikacji Gradle

Jak zaktualizować opakowanie Gradle

AMing
źródło
1
Czy „oczekiwano czy literówka”? Czy wszystkie argumenty należy przekazywać jako ciąg znaków rozdzielony pojedynczymi cudzysłowami?
RecuencoJones
@RecuencoJones Naprawiono na docs.gradle.org/current/userguide/…
Drew Stephens
1
gradle run --args = 'foo --bar'
Jim Flood
3
'foo --bar'jest mylące, dlaczego po prostu nie użyć 'foo bar'.
Eric Wang,
4
@EricWang Są to dowolne argumenty wiersza poleceń, których może potrzebować program. Miło jest pokazać, że gradle obsługuje wszelkiego rodzaju argumenty, ponieważ nieprzetworzony łańcuch jest przekazywany do zbudowanej aplikacji.
Joffrey
100

Gradle 4.9+

gradle run --args='arg1 arg2'

Zakłada się, że masz build.gradleskonfigurowaną wtyczkę Application . Twój build.gradlepowinien wyglądać podobnie do tego:

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

Uwzględnij w swoim build.gradle:

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

Następnie do uruchomienia: gradle run -PappArgs="['arg1', 'args2']"

xlm
źródło
7
Ta odpowiedź była nie tylko pomocna, ale i najprostsza.
Jossie Calderon
Aktualizacja dla Twojej aktualizacji: gradle run --args 'arg1 arg2'nie działa dla mnie. Musiałem zrobić:gradle run --args='arg1 arg2'
cmyers
@cmyers dzięki za złapanie tego! Zaktualizowałem moją aktualizację
xlm
28

Przepraszam za tak późną odpowiedź.

Znalazłem podobną odpowiedź na @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
}

I wywołaj jak:

gradle run -Pmyargs=-d,s
RecuencoJones
źródło
28

Jeśli chcesz używać tego samego zestawu argumentów przez cały czas, wystarczy poniższe.

run {
    args = ["--myarg1", "--myarg2"]
}
Claudio Fahey
źródło
2
Ok, dla absolutnie początkujących, takich jak ja: aby móc zdefiniować zadanie uruchamiania, twój build.gradle powinien zawierać następujące dwie linie: zastosuj wtyczkę: 'application' mainClassName = "<pełna nazwa klasy wraz ze ścieżką do pakietu>" W przeciwnym razie nie możesz zdefiniować metoda run w buuild.gradle
mk ..
1
Używam id 'application'wtyczki i to była odpowiedź, której potrzebowałem (działa).
Big Rich
6

Rozwiązanie można znaleźć w artykule Problemy z przekazywaniem właściwości i parametrów systemowych podczas uruchamiania klasy Java za pośrednictwem Gradle . Oba wymagają użycia rozszerzeniaargs nieruchomości

Powinieneś także przeczytać różnicę między zaliczaniem z -Dlub z -Ptym, co jest wyjaśnione w dokumentacji Gradle

Francisco J. Lopez-Pellicer
źródło
Też to widziałem. Nadal poszukuje. Wydaje się, że wszystkie te metody chcą edytować / masować bieżące właściwości i przekazywać je dalej. Właściwości wiersza poleceń i języka Java służące do uruchamiania aplikacji lub usługi są podobne do ustawienia „Kontekst” lub „Konfiguracja”. Byłoby lepiej mieć wtyczkę, która wykonuje takie rzeczy jak „uruchamianie parametrów” jako profile obok siebie lub coś w tym rodzaju.
będzie
5

Oczywiście odpowiedzi przede wszystkim działają, ale nadal chciałbym użyć czegoś takiego

gradle run path1 path2

cóż, nie da się tego zrobić, ale co, jeśli możemy:

gralde run --- path1 path2

Jeśli uważasz, że jest bardziej elegancki, możesz to zrobić, sztuka polega na przetworzeniu wiersza poleceń i zmodyfikowaniu go przed wykonaniem gradle, można to zrobić za pomocą skryptów inicjujących

Poniższy skrypt startowy:

  1. Przetwórz wiersz poleceń i usuń --- oraz wszystkie inne argumenty następujące po znaku „---”
  2. Dodaj właściwość „appArgs” do gradle.ext

Więc w zadaniu uruchamiania (lub JavaExec, Exec) możesz:

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

                args appArgs

 }

Skrypt startowy to:

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

Ograniczenia:

  1. Byłem zmuszony użyć „---”, a nie „-”
  2. Musisz dodać globalny skrypt startowy

Jeśli nie lubisz globalnego skryptu init, możesz go określić w linii poleceń

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

Lub lepiej dodaj alias do swojej powłoki:

gradleapp run --- f:/temp/x.xml
Boaz Nahum
źródło
2
To działa świetnie ... jeśli żaden z moich argumentów nie zaczyna się od myślnika. To czyni go bezużytecznym dla zwykłych parserów wiersza poleceń :(. Jak tylko to się stanie, gradle wydaje się traktować ten argument jako argument dla gradle (nie sądzę, że argsI.remove()daje to pożądany efekt). Sugestie?
Krease
3

Musisz je przekazać jako argszadanie za pomocą właściwości projektu, na przykład:

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

dodane do definicji zadania (zobacz dokumentację dsl )

Następnie możesz uruchomić go jako:

gradle -Ph run
cjstehno
źródło