Як передавати аргументи з командного рядка в gradle


105

Я намагаюся передати аргумент з командного рядка до класу java. Я дотримувався цієї публікації: http://gradle.1045684.n5.nabble.com/Gradle-application-plugin-question-td5539555.html, але код не працює для мене (можливо, він не призначений для JavaExec?). Ось що я спробував:

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

Вихід з вищевказаного твердо кодованого значення аргументів становить:

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

Однак, як тільки я міняю код, щоб використовувати розділ hasProperty та передавати "демонстрацію" як аргумент у командному рядку, я отримую 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) 

На сайті http://gradle.1045684.n5.nabble.com/file/n5709919/testgradle.zip є простий тестовий проект, який ілюструє проблему.

Для цього використовується Gradle 1.0-rc-3. NullPointer є з цього рядка коду:

args group 

Перед визначенням завдання я додав таке завдання, але результат не змінив:

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

Будь-які вказівки щодо того, як передавати аргументи командного рядка gradle оцінили.


TNX багато @ Джошуа Голдберг. зразок для одного аргументу: stackoverflow.com/a/58202665/2201814
MHSFisher

Відповіді:


63

project.groupє заздалегідь визначеною властивістю. З -P, ви можете встановлювати лише властивості проекту, які не визначені заздалегідь. Крім того, ви можете встановити властивості системи Java ( -D).


3
Дякую що дали мені знати! Зміна назви на testngGroup виправила проблему. Знайдено список заданих властивостей у таблиці 13.1 за адресою gradle.org/docs/current/userguide/writing_build_scripts.html .
Лідія

2
Просто для оновлення посилання: docs.gradle.org/current/userguide/…
Кіківа

56

Спираючись на відповідь Петра Н, це приклад того, як додати (необов’язково) аргументовані користувачем аргументи для передачі до основного Java для завдання JavaExec (оскільки ви не можете встановити властивість 'args' вручну з тієї причини, яку він цитує).

Додайте це до завдання:

task(runProgram, type: JavaExec) {

  [...]

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

... і запустити в командному рядку так

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

2
Як я міг би мати окремі параметри? Наприклад: gradle run -Purl='localhost', -Pport='8080', -Pusername='admin' як повинен виглядати мій код у build.gradle?
Томаш

@Tomas Я б запропонував чітко визначити питання вищого рівня. (Я не знаю такої ситуації досить добре, щоб все-таки швидко дати швидку відповідь.)
Джошуа Голдберг,

1
Не хвилюйтесь, зробили це вже і розібралися тут
Томаш

28

Моя програма з двома аргументами, args [0] та 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]);

мій build.gradle

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

мій термінальний рядок:

gradle run  -PappArgsWhatEverIWant="['localhost','8080']"

17

На додаток Gradle 4.9 плагін програми розуміє --argsваріант, тому передача аргументів проста, як:

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

баш

./gradlew run --args='This string will be passed into my.App#main arguments'

15

Можна використовувати спеціальні параметри командного рядка в Gradle, щоб утворити щось подібне:

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

Однак параметри командного рядка в Gradle є інкубаційною функцією .

Рішення Java

Щоб закінчити щось подібне, дотримуйтесь інструкцій тут :

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

Потім зареєструйте його:

task printPet(type: PrintPet)

Тепер ви можете зробити:

./gradlew printPet --pet="puppies"

вихід:

Щенята! дивовижні!

Розчин Котліна

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

потім зареєструйте завдання за допомогою:

tasks.register<PrintPet>("printPet")

5

Якщо вам потрібно перевірити і встановити один аргумент , ваш build.gradleфайл буде таким:

....

def coverageThreshold = 0.15

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

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

І команда Sample у Windows:

чистий тест gradlew -Presres = 0,25


4

Я написав фрагмент коду, який розміщує аргументи командного рядка у форматі, який очікує 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(',')) + "]"
}

моє завдання виглядає так:

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

Щоб передати аргументи з командного рядка, виконайте наступне:

gradle runProgram -PcommandLineArgs="arg1 arg2 arg3 arg4"    

1

Тут є чудовий приклад:

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

Які деталі можна передати параметрами, а потім надати за замовчуванням у змінній ext, наприклад:

gradle -Dmy_app.color=blue

а потім посилання в Gradle як:

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

І тоді будь-де у вашому сценарії збірки ви можете посилатися на нього як звичайно будь-де, де ви можете посилатися на нього project.ext.color

Більше порад тут: https://kb.novaordis.com/index.php/Gradle_Variables_and_Properties


-4

передайте URL-адресу з командного рядка, зберігайте URL-адресу у файлі gradle програми таким чином, як ResValue "string", "url", CommonUrl

і дайте параметр у файлах gradle.properties наступним чином CommonUrl = "поставте тут свій URL або може бути порожнім"

і передайте команду до командного рядка наступним чином gradle assembleRelease -Pcommanurl = поставте тут свою URL-адресу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.