source

그라들 태스크 - Java 응용 프로그램에 인수를 전달합니다.

factcode 2022. 9. 22. 00:08
반응형

그라들 태스크 - Java 응용 프로그램에 인수를 전달합니다.

커스텀 그래들태스크와 함께 실행되는 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.

그래들 태스크는 다음과 같습니다.

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

나는 달리기를 시도했다.gradle run -h효과가 없습니다.

그라들 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'
}

프리 그레이들 4.9

다음 항목을 포함하다build.gradle:

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

실행 방법:gradle run -PappArgs="['arg1', 'args2']"

Gradle 4.9 이후 명령줄 인수는 --args로 전달할 수 있습니다.예를 들어 명령줄 인수를 사용하여 응용 프로그램을 시작하려는 경우foo --bar, 를 사용할 수 있습니다.

gradle run --bars='foo --bar'

참고 항목 Gradle 응용 프로그램 플러그인

Gradle 래퍼 업그레이드 방법

항상 같은 인수 세트를 사용하는 경우는, 다음의 조작만으로 충분합니다.

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

답장이 늦어서 죄송합니다.

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

해결 방법은 Gradle을 통해 Java 클래스를 실행할 때 시스템 속성 및 매개 변수를 전달하는 문제에서 찾을 수 있습니다. 둘 다 를 사용하는 것과 관련이 있습니다.args소유물

또, 패스와의 차이도 읽어 주세요.-D또는 을 사용하여-PGradle 문서에 설명되어 있습니다.

물론 위의 답변이 그 역할을 하지만, 그래도 나는 다음과 같은 것을 사용하고 싶다.

gradle run path1 path2

그럴 수는 없지만, 만약 우리가 할 수 있다면요?

gralde run --- path1 path2

보다 우아하다고 생각되면 실행할 수 있습니다.그래들 전에 명령줄을 처리하여 수정하는 것이 중요합니다.이것은 init 스크립트를 사용하여 실행할 수 있습니다.

다음 init 스크립트는 다음과 같습니다.

  1. 명령줄 처리 후 --- 및 '---' 뒤에 오는 모든 인수를 삭제합니다.
  2. gradle에 속성 'appArgs'를 추가합니다.익스텐트

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

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

                args appArgs

 }

init 스크립트는 다음과 같습니다.

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

언급URL : https://stackoverflow.com/questions/27604283/gradle-task-pass-arguments-to-java-application

반응형