我有一个使用自定义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
并且无效。
答案 0 :(得分:83)
<强>更新强>
Gradle 4.9为传递命令行参数提供了更好的支持,例如:
gradle run --args='arg1 arg2'
Pre-Gradle 4.9,将以下内容添加到build.gradle
:
run {
if (project.hasProperty("appArgs")) {
args Eval.me(appArgs)
}
}
然后运行:gradle run -PappArgs="['arg1', 'args2']"
答案 1 :(得分:36)
从Gradle 4.9开始,可以使用--args传递命令行参数。例如,如果要使用命令行参数foo --bar
启动应用程序,则可以使用
gradle run --args ='foo --bar'
答案 2 :(得分:27)
很抱歉这么晚回答。
我认为答案与@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
答案 3 :(得分:19)
如果你想一直使用同一组参数,你只需要以下内容。
run {
args = ["--myarg1", "--myarg2"]
}
答案 4 :(得分:7)
您可以在Problems passing system properties and parameters when running Java class via Gradle中找到解决方案。两者都涉及使用args
属性
另外,您应该阅读-D
或-P
传递的区别in the Gradle documentation
答案 5 :(得分:5)
当然,上面的答案都可以完成这项工作,但我仍然希望使用像
这样的东西gradle run path1 path2
这不可能做到,但如果我们可以做到:
gralde run --- path1 path2
如果您认为它更优雅,那么您可以这样做,诀窍是处理命令行并在gradle之前修改它,这可以通过使用init scripts
来完成下面的init脚本:
因此,在您的运行任务(或JavaExec,Exec)中,您可以:
if (project.gradle.hasProperty("appArgs")) {
List<String> appArgs = project.gradle.appArgs;
args appArgs
}
init脚本是:
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
限制:
如果您不喜欢全局init脚本,可以在命令行中指定它
gradle -I init.gradle run --- f:/temp/x.xml
或者更好地为shell添加别名:
gradleapp run --- f:/temp/x.xml
答案 6 :(得分:2)
您需要使用项目属性将它们作为args
传递给任务,例如:
args = [project.property('h')]
已添加到您的任务定义中(请参阅dsl docs)
然后你可以运行它:
gradle -Ph run