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


127

我有一个运行自定义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,但无法正常工作。


答案是否符合您的需求?如果是这样,则应将其中一个标记为解决方案。
Francisco J. Lopez-Pellicer 2014年

1
并非如此...一个朋友,我发现了一种解决方法,但是我们还不清楚,因此要发布解决方案,两个提议的解决方案都经过了尝试,我们知道该怎么做,但是没有做到。 t确实看起来确实有效……
RecuencoJones 2014年

@ 6uitar6reat6od最后如何解决它?还有什么版本的gradle?
xlm 2015年

Answers:


80

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

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

另请参阅Gradle应用程序插件

如何升级Gradle包装器


1
是预期的还是错字?是否所有参数都应作为由单引号分隔的字符串传递?
RecuencoJones

@RecuencoJones已在docs.gradle.org/current/userguide/…中修复-Drew
Stephens

1
gradle这个运行--args = '富--bar'
吉姆洪水

3
'foo --bar'令人困惑,为什么不只是使用'foo bar'
Eric Wang

4
@EricWang这些是程序可能需要的任意命令行参数。很高兴证明gradle支持任何类型的参数,因为原始字符串被传递到了构建的应用程序中。
乔佛里

100

摇篮4.9+

gradle run --args='arg1 arg2'

假设您build.gradle已使用Application插件配置。您的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']"


7
这个答案不仅有用,而且最简单。
Jossie Calderon

更新您的更新:gradle run --args 'arg1 arg2'不适用于我。我必须做:gradle run --args='arg1 arg2'
cmyers

@cmyers感谢您注意到这一点!我已经更新了更新
xlm

28

抱歉这么晚回答。

我想出了类似@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

28

如果您想一直使用同一组参数,那么下面就是您所需要的。

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

2
好的,对于像我这样的绝对初学者来说:为了能够定义运行任务,您的build.gradle应该包含以下两行:apply plugin:'application'mainClassName =“ <包含包路径的完整类名>”否则,您将无法定义buuild.gradle
mk中

1
我正在使用id 'application'插件,这是我需要的答案(有效)。
大富翁

6

您可以在通过Gradle运行Java类时传递系统属性和参数时遇到问题中找到解决方案。两者都涉及args财产的使用

另外,您应该阅读Gradle文档中说明的-D与传递之间的区别-P


也看到了 还在找。所有这些方法似乎都想编辑/按摩当前属性并传递它们。用于运行应用程序或服务的命令行和Java属性类似于“上下文”或“配置”设置。最好有一个插件来做诸如“运行参数”之类的并行配置文件或类似的工作。

5

当然,最重要的是答案可以解决问题,但我仍然想使用类似

gradle run path1 path2

好吧,这不可能完成,但是如果可以的话:

gralde run --- path1 path2

如果您认为它更优雅,则可以这样做,诀窍是在gradle之前处理命令行并对其进行修改,这可以通过使用init脚本来完成

下面的初始化脚本:

  1. 处理命令行并删除---和'---'之后的所有其他参数
  2. 将属性'appArgs'添加到gradle.ext

因此,在您的运行任务(或JavaExec,Exec)中,您可以:

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

                args appArgs

 }

初始化脚本是:

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

2
如果我的论点都没有以破折号开头,那么效果很好。这使得无用的常见命令行解析器 :(一旦出现这种情况,似乎gradle这个来治疗ARG作为参数传递给gradle这个(我不认为,argsI.remove()是有预期的效果)的建议。?
Krease

3

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

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

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

然后,您可以将其运行为:

gradle -Ph run
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.