Gradle task - pass arguments to Java application

后端 未结 7 2182
春和景丽
春和景丽 2020-12-04 14:40

I have a Java application that runs with a custom gradle task and the application requires some arguments upon being invoked. These are:

programName ( string         


        
7条回答
  •  时光取名叫无心
    2020-12-04 15:23

    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 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 appArgs = new ArrayList<>()
    
    tasks.forEach {
       List args = it.getArgs();
    
    
       Iterator 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
    

提交回复
热议问题