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脚本:
- 处理命令行并删除—以及“—”后的所有其他参数
- 将属性“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
限制:
- 我被迫使用“—”而不是“ – ”
- 你必须添加一些全局的初始化脚本
如果您不喜欢全局初始化脚本,则可以在命令行中指定它
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