【问题标题】:How to pass multiple parameters in command line when running gradle task?运行gradle任务时如何在命令行中传递多个参数?
【发布时间】:2016-01-19 11:29:02
【问题描述】:

我有一个由 gradle 任务运行的 java 和 groovy 类。我已经设法让它工作,但我不喜欢在命令行中传递参数的方式。这是我目前通过命令行执行的操作:gradle runTask -Pmode"['doStuff','username','password']"
采用这些参数的 build.gradle 代码如下所示:

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

然后我在我的 java 代码中使用我的参数/参数,如下所示:

String action = args[0]; //"doStuff"
String name = args[1]; .. //"username"

我想知道有没有办法以更好的方式传递参数,例如:

gradle runTask -Pmode=doStuff -Puser=username -Ppass=password 

以及如何在我的 java 类中使用它们。

【问题讨论】:

  • 我假设这些 java 类是项目代码的一部分,由 gradle 运行,对吗?你的任务是如何运行它们的?
  • @Adam 是的,你是对的,我的任务使用 javaexec 运行它们,它在其中一个 java 类中运行 main() 方法
  • 好的,我明白问题了,等几分钟再回复)
  • 传递给main 的命令行参数不是映射。您已经拥有的是与他们合作的常用方式。看起来您正在尝试像系统属性一样使用它们,这是故意不同的。相关问题:stackoverflow.com/questions/11696521
  • @blgt 所以这意味着我的方式(使用参数数组)是在这种情况下通过命令行传递参数的唯一方法?我的意思是我可以使用它,但我一直在寻找比这更好的方法,因为所有这些引号和括号很容易出现人为错误

标签: java gradle build.gradle


【解决方案1】:

JavaExec 可能是要走的路。只需声明一个任务并将项目参数传递给 java app:

task myExecTask(type: JavaExec) {
   classpath = sourceSets.main.runtimeClasspath
   main = 'com.project.MyApplicationMainClass' 
   args project.getProperty('userName') + ' ' + project.getProperty('password');
}

要运行它,只需写gradle myExecTask -PuserName=john -Ppassword=secret

【讨论】:

  • 太棒了,工作就像一个魅力,正是我所需要的,谢谢你,先生!
  • 对此有什么想法吗?如果我想运行相同的任务但没有获取某些属性怎么办,例如我想只使用 gradle myExecTask -Pmode=doStuff 而不是 gradle myExecTask -Pmode=doStuff -PuserName=john -Ppassword=secret 运行任务,它会抛出我并错误说属性 'usernName' 和 'password'没有找到..
  • @Tomas 是的,当属性不存在时,gradle 会抛出烦人的异常。避免它的唯一方法是首先调用 project.hasProperty('name') 来检查是否设置了属性。
  • 参数是否应该用逗号而不是空格分隔?即args project.getProperty('userName'), project.getProperty('password'); 而不是args project.getProperty('userName') + ' ' + project.getProperty('password');
  • @RiteshTendulkar 你是对的,JavaExec 任务中的 args 参数具有 Iterable 类型,所以使用逗号更正确。空格也可以工作,因为最后可迭代的参数变成了字符串。
【解决方案2】:

这对我有用:

task myExecTask(type: JavaExec) {
  classpath = sourceSets.main.runtimeClasspath
  main = 'com.project.MyApplicationMainClass' 
  args(user, pass); // no need to access user and pass via project.getProperty()
}
  • args 需要构建为字符串列表供 java main 使用。
  • args 现在应该采用以下形式:['myusername', 'mypassword']

【讨论】:

    【解决方案3】:

    这是我必须为通过 gradle 传递参数而创建的任务 任务

    task cucumber() {
        dependsOn assemble, compileTestJava
        doLast {
            javaexec {
                systemProperties = [
                        usr: project.getProperty('usr'),
                        pwd: project.getProperty('pwd')
                ]
                main = "io.cucumber.core.cli.Main"
                classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
                args = ['--plugin', 'pretty', '--glue', 'location to step def', 'location to feature files']
            }
        }
    }
    

    为了执行测试 $ gradle cucumber -Pusr=<username> -Ppwd=<password>

    访问代码中的参数System.getProperty("usr"), System.getProperty("pwd")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 2020-08-02
      • 2021-04-21
      • 2021-12-28
      • 2021-03-31
      • 2015-03-06
      相关资源
      最近更新 更多