Gradle任务 - 将参数传递给Java应用程序

时间:2014-12-22 14:06:58

标签: java gradle arguments

我有一个使用自定义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并且无效。

7 个答案:

答案 0 :(得分:83)

<强>更新
Gradle 4.9为传递命令行参数提供了更好的支持,例如:

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

答案 1 :(得分:36)

从Gradle 4.9开始,可以使用--args传递命令行参数。例如,如果要使用命令行参数foo --bar启动应用程序,则可以使用

  

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

See Also Gradle Application Plugin

How to upgrade Gradle wrapper

答案 2 :(得分:27)

很抱歉这么晚回答。

我认为答案与@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

答案 3 :(得分:19)

如果你想一直使用同一组参数,你只需要以下内容。

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

答案 4 :(得分:7)

您可以在Problems passing system properties and parameters when running Java class via Gradle中找到解决方案。两者都涉及使用args属性

另外,您应该阅读-D-P传递的区别in the Gradle documentation

答案 5 :(得分:5)

当然,上面的答案都可以完成这项工作,但我仍然希望使用像

这样的东西
gradle run path1 path2

这不可能做到,但如果我们可以做到:

gralde run --- path1 path2

如果您认为它更优雅,那么您可以这样做,诀窍是处理命令行并在gradle之前修改它,这可以通过使用init scripts

来完成

下面的init脚本:

  1. 处理命令行并删除---以及“---”
  2. 之后的所有其他参数
  3. 将属性'appArgs'添加到gradle.ext
  4. 因此,在您的运行任务(或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. 您必须添加一些全局初始化脚本
    3. 如果您不喜欢全局init脚本,可以在命令行中指定它

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

      或者更好地为shell添加别名:

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

答案 6 :(得分:2)

您需要使用项目属性将它们作为args传递给任务,例如:

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

已添加到您的任务定义中(请参阅dsl docs

然后你可以运行它:

gradle -Ph run