Jak przekazać argumenty z wiersza poleceń do gradle

105

Próbuję przekazać argument z wiersza poleceń do klasy java. Śledziłem ten post: http://gradle.1045684.n5.nabble.com/Gradle-application-plugin-question-td5539555.html, ale kod nie działa dla mnie (może nie jest przeznaczony dla JavaExec?). Oto, czego próbowałem:

task listTests(type:JavaExec){
    main = "util.TestGroupScanner"
    classpath = sourceSets.util.runtimeClasspath
    // this works...
    args 'demo'
    /*
    // this does not work!
    if (project.hasProperty("group")){
        args group
    }
    */
}

Dane wyjściowe z powyższej zakodowanej na stałe wartości argumentów to:

C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle>g listTests
:compileUtilJava UP-TO-DATE
:processUtilResources UP-TO-DATE
:utilClasses UP-TO-DATE
:listTests
Received argument: demo

BUILD SUCCESSFUL

Total time: 13.422 secs

Jednak po zmianie kodu, aby używał sekcji hasProperty i przekazaniu „demo” jako argumentu w wierszu poleceń, otrzymuję wyjątek NullPointerException:

C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle>g listTests -Pgroup=demo -s

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle\build.gradle' line:25

* What went wrong:
A problem occurred evaluating root project 'testgradle'.
> java.lang.NullPointerException (no error message)

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.GradleScriptException: A problem occurred evaluating root project
 'testgradle'.
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:54)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:127)
    at org.gradle.configuration.BuildScriptProcessor.evaluate(BuildScriptProcessor.java:38) 

Istnieje prosty projekt testowy dostępny pod adresem http://gradle.1045684.n5.nabble.com/file/n5709919/testgradle.zip, który ilustruje problem.

Używa Gradle 1.0-rc-3. NullPointer pochodzi z tego wiersza kodu:

args group 

Dodałem następujące zadanie przed definicją zadania, ale nie zmieniło to wyniku:

group = hasProperty('group') ? group : 'nosuchgroup' 

Wszelkie wskazówki dotyczące przekazywania argumentów wiersza poleceń do gradle są mile widziane.

Lidia
źródło
TNX dużo @Joshua Goldberg. przykład dla jednego argumentu: stackoverflow.com/a/58202665/2201814
MHSFisher

Odpowiedzi:

63

project.groupjest predefiniowaną właściwością. Za pomocą -Pmożna ustawić tylko właściwości projektu, które nie są wstępnie zdefiniowane. Alternatywnie możesz ustawić właściwości systemowe Java ( -D).

Peter Niederwieser
źródło
3
Dzięki, że dałeś mi znać! Zmiana nazwy na testngGroup rozwiązała problem. Znaleziono listę wstępnie zdefiniowanych właściwości w tabeli 13.1 pod adresem gradle.org/docs/current/userguide/writing_build_scripts.html .
Lidia
2
Wystarczy zaktualizować link: docs.gradle.org/current/userguide/…
Kikiwa
56

Opierając się na odpowiedzi Petera N., jest to przykład dodawania (opcjonalnych) argumentów określonych przez użytkownika, które mają być przekazane do pliku głównego Java dla zadania JavaExec (ponieważ nie można ustawić właściwości `` args '' ręcznie z powodów, które przytacza).

Dodaj to do zadania:

task(runProgram, type: JavaExec) {

  [...]

  if (project.hasProperty('myargs')) {
      args(myargs.split(','))
  }

... i uruchom z linii poleceń w ten sposób

% ./gradlew runProgram '-Pmyargs=-x,7,--no-kidding,/Users/rogers/tests/file.txt'
Joshua Goldberg
źródło
2
Jak mogę zająć się posiadaniem oddzielnych parametrów? Np .: gradle run -Purl='localhost', -Pport='8080', -Pusername='admin' jak powinien wyglądać mój kod w build.gradle?
Tomas
@Tomas Sugerowałbym rozwinięcie w tym celu pytania najwyższego poziomu. (Nie wiem, że sytuacja na tyle dobrze, aby dać szybką odpowiedź inline tutaj sam, tak.)
Joshua Goldberg
1
Nie martw się, zrobiłem to już i załatwiłem tutaj
Tomas
28

Mój program z dwoma argumentami, argumentami [0] i argumentami [1]:

public static void main(String[] args) throws Exception {
    System.out.println(args);
    String host = args[0];
    System.out.println(host);
    int port = Integer.parseInt(args[1]);

mój build.gradle

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

mój terminal:

gradle run  -PappArgsWhatEverIWant="['localhost','8080']"
Oscar Raig Colon
źródło
17

Od wersji Gradle 4.9 wtyczka aplikacji rozumie --argsopcje, więc przekazywanie argumentów jest tak proste, jak:

build.gradle

plugins {
    id 'application'
}

mainClassName = "my.App"

src / main / java / my / App.java

public class App {
    public static void main(String[] args) {
        System.out.println(args);
    }
}

grzmotnąć

./gradlew run --args='This string will be passed into my.App#main arguments'
szaleniec
źródło
16

Możliwe jest wykorzystanie niestandardowych opcji wiersza poleceń w Gradle, aby uzyskać coś takiego:

./gradlew printPet --pet="puppies!"

Jednak niestandardowe opcje wiersza poleceń w Gradle są funkcją inkubacji .

Rozwiązanie Java

Aby skończyć z czymś takim, postępuj zgodnie z instrukcjami tutaj :

import org.gradle.api.tasks.options.Option;

public class PrintPet extends DefaultTask {
    private String pet;

    @Option(option = "pet", description = "Name of the cute pet you would like to print out!")
    public void setPet(String pet) {
        this.pet = pet;
    }

    @Input
    public String getPet() {
        return pet;
    }

    @TaskAction
    public void print() {
        getLogger().quiet("'{}' are awesome!", pet);
    }
}

Następnie zarejestruj go:

task printPet(type: PrintPet)

Teraz możesz:

./gradlew printPet --pet="puppies"

wynik:

Szczenięta! są niesamowite!

Rozwiązanie Kotlin

open class PrintPet : DefaultTask() {

    @Suppress("UnstableApiUsage")
    @set:Option(option = "pet", description = "The cute pet you would like to print out")
    @get:Input
    var pet: String = ""

    @TaskAction
    fun print() {    
        println("$pet are awesome!")
    }
}

następnie zarejestruj zadanie w:

tasks.register<PrintPet>("printPet")
David Rawson
źródło
5

Jeśli chcesz sprawdzić i ustawić jeden argument , Twój build.gradleplik wyglądałby tak:

....

def coverageThreshold = 0.15

if (project.hasProperty('threshold')) {
    coverageThreshold = project.property('threshold').toString().toBigDecimal()
}

//print the value of variable
println("Coverage Threshold: $coverageThreshold")
...

Oraz przykładowe polecenie w oknach:

test czystości gradlew -Pthreshold = 0,25

MHSFisher
źródło
4

Napisałem fragment kodu, który umieszcza argumenty wiersza poleceń w formacie, którego oczekuje gradle.

// this method creates a command line arguments
def setCommandLineArguments(commandLineArgs) {
    // remove spaces 
    def arguments = commandLineArgs.tokenize()

            // create a string that can be used by Eval 
            def cla = "["
            // go through the list to get each argument
            arguments.each {
                    cla += "'" + "${it}" + "',"
            }

    // remove last "," add "]" and set the args 
    return cla.substring(0, cla.lastIndexOf(',')) + "]"
}

moje zadanie wygląda następująco:

task runProgram(type: JavaExec) {
    if ( project.hasProperty("commandLineArgs") ) {
            args Eval.me( setCommandLineArguments(commandLineArgs) )
    }
}

Aby przekazać argumenty z wiersza poleceń, uruchom to:

gradle runProgram -PcommandLineArgs="arg1 arg2 arg3 arg4"    
Sebastian Musial
źródło
1

Oto świetny przykład:

https://kb.novaordis.com/index.php/Gradle_Pass_Configuration_on_Command_Line

Jakie szczegóły można przekazać parametry, a następnie podać wartość domyślną w zmiennej rozszerzającej, na przykład:

gradle -Dmy_app.color=blue

a następnie odniesienie w Gradle jako:

ext {
   color = System.getProperty("my_app.color", "red");
}

A potem w dowolnym miejscu skryptu kompilacji możesz odwołać się do niego jako kursu, gdziekolwiek możesz odwołać się do niego jako project.ext.color

Więcej wskazówek tutaj: https://kb.novaordis.com/index.php/Gradle_Variables_and_Properties

Matt Wolfe
źródło
-4

Przekaż adres URL z wiersza poleceń zachowaj swój adres URL w pliku gradle aplikacji w następujący sposób resValue "string", "url", CommonUrl

i podaj parametr w plikach gradle.properties w następujący sposób CommonUrl = "umieść tutaj swój adres URL lub może być pusty"

i przekaż polecenie do z wiersza poleceń w następujący sposób gradle assembleRelease -Pcommanurl = wpisz tutaj swój adres URL

Arun Kawdiya
źródło