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

사용자 지정 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하지 않습니다.



답변

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

gradle run –args = ‘foo –bar’

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

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


답변

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']"


답변

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

@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


답변

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

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


답변

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

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


답변

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

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


답변

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

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

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

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

gradle -Ph run