我有一个使用自定义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
,但是不起作用.
很抱歉这么晚回答.
我找到了@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 4.9为传递命令行参数提供了更好的支持,例如:
plugins { // Implicitly applies Java plugin id: 'application' } application { // URI of your main class/application's entry point (required) mainClassName = 'org.gradle.sample.Main' }
Pre-Gradle 4.9,将以下内容添加到build.gradle
:
run { if (project.hasProperty("appArgs")) { args Eval.me(appArgs) } }
然后运行: gradle run --args='arg1 arg2'
当然,最重要的是答案可以完成工作,但是我仍然想使用类似
gradle run path1 path2
好吧,这不可能完成,但是如果可以的话:
gralde run --- path1 path2
如果您认为它更优雅,则可以这样做,诀窍是在gradle之前处理命令行并对其进行修改,这可以通过使用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
或更好地为您的外壳添加别名:
gradleapp run --- f:/temp/x.xml
如果您想一直使用相同的参数集,那么您只需要以下内容.
run { args = ["--myarg1", "--myarg2"] }
从Gradle 4.9开始,命令行参数可以与--args一起传递.例如,如果要使用命令行参数启动应用程序foo --bar
,则可以使用
gradle run --args ='foo --bar'
另请参阅Gradle应用程序插件
如何升级Gradle包装器
您可以在通过Gradle运行Java类时在Problems传递系统属性和参数时找到解决方案.两者都涉及使用args
财产
您还应该阅读Gradle文档中解释的传递-D
或使用-P
它之间的区别