[gradle] 명령 줄에서 Gradle로 인수를 전달하는 방법

명령 줄에서 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
    }
    */
}

위의 하드 코딩 된 args 값의 출력은 다음과 같습니다.

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 섹션을 사용하도록 코드를 변경하고 명령 줄에서 “demo”를 인수로 전달하면 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에 명령 줄 인수를 전달하는 방법에 대한 모든 포인터는 감사합니다.



답변

project.group미리 정의 된 속성입니다. 으로 -P만되는 프로젝트 속성 설정할 수 없습니다 미리 정의합니다. 또는 Java 시스템 속성 ( -D)을 설정할 수 있습니다 .


답변

Peter N의 답변을 바탕으로 JavaExec 작업을 위해 Java main에 전달할 (선택 사항) 사용자 지정 인수를 추가하는 방법의 예입니다 (그가 인용 한 이유로 ‘args’속성을 수동으로 설정할 수 없기 때문입니다.)

작업에 다음을 추가하십시오.

task(runProgram, type: JavaExec) {

  [...]

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

… 다음과 같이 명령 줄에서 실행합니다.

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


답변

두 개의 인수, 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']"


답변

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'


답변

Gradle에서 사용자 지정 명령 줄 옵션을 활용하여 다음과 같은 결과를 얻을 수 있습니다.

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

그러나 Gradle의 사용자 지정 명령 줄 옵션은 인큐베이팅 기능 입니다.

자바 솔루션

이와 같은 결과를 얻으려면 여기 지침을 따르십시오 .

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"

산출:

강아지! 굉장한 데!

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

그런 다음 다음을 사용하여 작업을 등록하십시오.

tasks.register<PrintPet>("printPet")


답변

당신이 설정을 확인해야 할 경우 하나 개의 인수를 , 당신의 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")
...

Windows의 샘플 명령 :

gradlew clean test -Pthreshold = 0.25


답변

나는 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"