Gradle 작업-Java 애플리케이션에 인수 전달


127

사용자 지정 gradle 작업으로 실행되는 Java 응용 프로그램이 있으며 응용 프로그램이 호출되면 몇 가지 인수가 필요합니다. 이것들은:

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.

Gradle 작업은 다음과 같습니다.

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

나는 달리기를 시도했지만 작동 gradle run -h하지 않습니다.


답변이 귀하의 요구 사항에 맞습니까? 그렇다면 솔루션으로 표시해야합니다.
Francisco J. Lopez-Pellicer 2014

1
별로 ... 친구와 나는 그것을 할 방법을 발견했지만 해결책을 게시 할 수 있을지 아직 명확하지 않았습니다. 두 제안 된 해결책을 모두 시도했습니다. 무엇을해야하는지 이해했지만 실패했습니다. t 정말 ... 제대로 작동
RecuencoJones

@ 6uitar6reat6od 결국 어떻게 해결 했나요? 또한 어떤 버전의 gradle?
xlm

답변:


80

Gradle 4.9부터 명령 줄 인수는 --args로 전달할 수 있습니다. 예를 들어 명령 줄 인수를 사용하여 애플리케이션을 시작하려면 foo --bar다음을 사용할 수 있습니다.

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

참조 Gradle 애플리케이션 플러그인

Gradle 래퍼를 업그레이드하는 방법


1
'예상 또는 오타입니까? 모든 인수를 작은 따옴표로 구분 된 문자열로 전달해야합니까?
RecuencoJones

@RecuencoJones docs.gradle.org/current/userguide/…에 따라 수정
Drew Stephens

1
Gradle을 실행 --args = 'foo는 --bar'
짐 홍수

3
'foo --bar'혼란 스럽습니다 'foo bar'..
에릭 왕

4
@EricWang 프로그램에 필요한 임의의 명령 줄 인수입니다. 원시 문자열이 빌드 된 애플리케이션에 전달되기 때문에 gradle이 모든 종류의 인수를 지원한다는 것을 보여주는 것이 좋습니다.
Joffrey

100

Gradle 4.9 이상

gradle run --args='arg1 arg2'

이것은 응용 프로그램 플러그인으로build.gradle 구성되어 있다고 가정합니다 . 귀하는 다음과 유사합니다 :build.gradle

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

다음을 포함하십시오 build.gradle.

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

그런 다음 실행하려면 : gradle run -PappArgs="['arg1', 'args2']"


7
이 답변은 도움이 될뿐만 아니라 가장 간단했습니다.
Jossie 칼데론

업데이트 업데이트 : gradle run --args 'arg1 arg2'저에게 적합하지 않았습니다. 나는해야했다 :gradle run --args='arg1 arg2'
cmyers

@cmyers 잡아 주셔서 감사합니다! 내 업데이트를 업데이트했습니다
xlm

28

너무 늦게 대답해서 죄송합니다.

@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
}

그리고 다음과 같이 호출하십시오.

gradle run -Pmyargs=-d,s

28

항상 동일한 인수 집합을 사용하려면 다음이 필요합니다.

run {
    args = ["--myarg1", "--myarg2"]
}

2
좋아, 나 같은 절대 초보자를 위해 : 실행 작업을 정의 할 수 있으려면 build.gradle에 다음 두 줄이 포함되어야합니다. apply plugin : 'application'mainClassName = "<전체 클래스 이름 (패키지 경로 포함)>"그렇지 않으면 정의 할 수 없습니다. buuild.gradle의 실행 방법
MK ..

1
나는 id 'application'플러그인을 사용하고 있으며 이것이 내가 필요한 대답이었습니다 (작동합니다).
Big Rich

6

Gradle을 통해 Java 클래스를 실행할 때 시스템 속성 및 매개 변수를 전달하는 문제 에서 해결 방법을 찾을 수 있습니다 . 둘 다 args재산 의 사용을 포함합니다

또한 당신과 함께 통과의 차이 읽어야 -D이상에서 -P설명 것을 Gradle을 문서에


이것도 봤어요. 여전히 쳐다보다. 이 모든 메서드는 현재 속성을 편집 / 마사지하고 전달하려는 것 같습니다. 애플리케이션 또는 서비스를 실행하기위한 명령 줄 및 Java 속성은 "컨텍스트"또는 "구성"설정과 유사합니다. 병렬 프로필 등으로 "실행 매개 변수"와 같은 작업을 수행하는 플러그인을 사용하는 것이 좋습니다.
것이다

5

물론 위의 답변은 모두 작업을 수행하지만 여전히 다음과 같은 것을 사용하고 싶습니다.

gradle run path1 path2

글쎄, 이것은 할 수 없지만 우리가 할 수 있다면 어떨까요?

gralde run --- path1 path2

더 우아하다고 생각되면 할 수 있습니다. 트릭은 명령 줄을 처리하고 gradle이 수행하기 전에 수정하는 것입니다.이 작업은 init 스크립트 를 사용하여 수행 할 수 있습니다.

아래의 초기화 스크립트 :

  1. 명령 줄을 처리하고 --- 및 '---'뒤에 오는 다른 모든 인수를 제거합니다.
  2. gradle.ext에 속성 'appArgs'추가

따라서 실행 작업 (또는 JavaExec, Exec)에서 다음을 수행 할 수 있습니다.

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

                args appArgs

 }

초기화 스크립트는 다음과 같습니다.

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

제한 사항 :

  1. 나는 '-'가 아니라 '---'를 사용해야했습니다.
  2. 전역 초기화 스크립트를 추가해야합니다.

전역 초기화 스크립트가 마음에 들지 않으면 명령 줄에서 지정할 수 있습니다.

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

또는 셸에 별칭을 추가하는 것이 좋습니다.

gradleapp run --- f:/temp/x.xml

2
내 주장이 대시로 시작하지 않으면 훌륭하게 작동합니다. 이것은 일반적인 명령 줄 파서 에게는 쓸모가 없게 만듭니다 . :(. 그 일이 발생하자마자 gradle은 해당 arg를 gradle에 대한 인수로 취급하는 것 같습니다 ( argsI.remove()원하는 효과가 있다고 생각하지 않습니다 ). 제안?
Krease

3

args다음과 같은 프로젝트 속성을 사용하여 작업 에 전달해야합니다 .

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

작업 정의에 추가됨 ( dsl 문서 참조 )

그런 다음 다음과 같이 실행할 수 있습니다.

gradle -Ph run
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.