programing tip

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

itbloger 2020. 8. 19. 07:49
반응형

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 이상

다음을 포함하십시오 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'
}

그런 다음 실행하려면 : gradle run --args='arg1 arg2'

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

You can find the solution in Problems passing system properties and parameters when running Java class via Gradle . Both involve the use of the args property

Also you should read the difference between passing with -D or with -P that is explained in the Gradle documentation


Of course the answers above all do the job, but still i would like to use something like

gradle run path1 path2

well this can't be done, but what if we can:

gralde run --- path1 path2

If you think it is more elegant, then you can do it, the trick is to process the command line and modify it before gradle does, this can be done by using init scripts

The init script below:

  1. Process the command line and remove --- and all other arguments following '---'
  2. Add property 'appArgs' to gradle.ext

So in your run task (or JavaExec, Exec) you can:

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

                args appArgs

 }

The init script is:

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

Limitations:

  1. I was forced to use '---' and not '--'
  2. You have to add some global init script

If you don't like global init script, you can specify it in command line

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

Or better add an alias to your shell:

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

You need to pass them as args to the task using project properties, something like:

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

added to your task definition (see the dsl docs)

Then you can run it as:

gradle -Ph run

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

반응형