Gradle任务 – 将parameter passing给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 ,它不起作用。

我有同样的问题,并设法解决它通过添加以下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 

您可以在通过Gradle运行Java类时,在传递系统属性和参数的问题中find解决scheme。 两者都涉及使用args属性

你也应该读一下在Gradle文档中解释的-D或者-P的区别

如果你想一直使用相同的参数集合,你只需要以下几点。

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

当然,以上的答案都可以做这个工作,但是我仍然想要使用类似的东西

 gradle run path1 path2 

这不能做到这一点,但如果我们能够做到这一点:

 gralde run --- path1 path2 

如果你认为它更优雅,那么你可以做到这一点,诀窍是处理命令行,并在gradle之前修改它,这可以通过使用init脚本

下面的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 

或者更好的添加一个别名到你的shell:

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

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

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

添加到您的任务定义(请参阅dsl文档 )

那么你可以运行它为:

 gradle -Ph run