web-dev-qa-db-fra.com

Comment passer des arguments de la ligne de commande à gradle

J'essaie de passer un argument de la ligne de commande à une classe Java. J'ai suivi ce post: http://gradle.1045684.n5.nabble.com/Gradle- application-plugin-question-td5539555.html mais le code ne fonctionne pas pour moi (peut-être n'est-il pas destiné à JavaExec?). Voici ce que j'ai essayé:

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
    }
    */
}

Le résultat de la valeur args codée en dur ci-dessus est:

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

Cependant, une fois que je modifie le code pour utiliser la section hasProperty et que je transmette "demo" en tant qu'argument sur la ligne de commande, je reçois une exception 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) 

Il existe un projet de test simple disponible sur http://gradle.1045684.n5.nabble.com/file/n5709919/testgradle.Zip qui illustre le problème.

Ceci utilise Gradle 1.0-rc-3. Le NullPointer provient de cette ligne de code:

args group 

J'ai ajouté l'affectation suivante avant la définition de la tâche, mais cela n'a pas modifié le résultat:

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

Tous les pointeurs sur la manière de passer des arguments de ligne de commande à gradé sont appréciés.

81
Lidia

project.group est une propriété prédéfinie. Avec -P, vous ne pouvez définir que les propriétés de projet qui sont non prédéfinies. Vous pouvez également définir Java) propriétés système (-D).

55
Peter Niederwieser

S'appuyant sur la réponse de Peter N, il s'agit d'un exemple montrant comment ajouter des arguments (facultatifs) spécifiés par l'utilisateur à transmettre à Java main pour une tâche JavaExec (étant donné que vous ne pouvez pas définir les "arguments" propriété manuellement pour la raison qu'il cite.)

Ajoutez ceci à la tâche:

task(runProgram, type: JavaExec) {

  [...]

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

... et lancez la ligne de commande comme ceci

% ./gradlew runProgram '-Pmyargs=-x,7,--no-kidding,/Users/rogers/tests/file.txt'
49
Joshua Goldberg

Mon programme avec deux arguments, args [0] et args [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]);

mon build.gradle

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

mon terminal invite:

gradle run  -PappArgsWhatEverIWant="['localhost','8080']"
26
Oscar Raig Colon

À partir de la version 4.9, le plug-in d'application comprend --args option, passer les arguments est aussi simple que:

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);
    }
}

bash

./gradlew run --args='This string will be passed into my.Class arguments'
9
madhead

J'ai écrit un morceau de code qui place les arguments de la ligne de commande dans le format attendu par 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(',')) + "]"
}

ma tâche ressemble à ceci:

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

Pour passer les arguments depuis la ligne de commande, lancez ceci:

gradle runProgram -PcommandLineArgs="arg1 arg2 arg3 arg4"    
3
Sebastian Musial

Il est possible d'utiliser des options de ligne de commande personnalisées dans Gradle pour obtenir quelque chose comme:

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

Cependant, les options de ligne de commande personnalisées dans Gradle sont un fonctionnalité d’incubation .

Solution Java

Pour obtenir quelque chose comme ceci, suivez les instructions ici :

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);
    }
}

Puis enregistrez-le:

task printPet(type: PrintPet)

Maintenant vous pouvez faire:

./gradlew printPet --pet="puppies"

sortie:

Chiots! sont géniaux!

Solution de 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!")
    }
}

puis enregistrez la tâche avec:

tasks.register<PrintPet>("printPet")
3
David Rawson