Gradle-向 Java 应用程序传递参数

我有一个 Java 应用程序,它使用一个自定义的 gradle 任务运行,并且在调用该应用程序时需要一些参数。这些是:

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.

分级任务是这样的:

task run (type: JavaExec){
description = "Secure algorythm testing"
main = 'main.Test'
classpath = sourceSets.main.runtimeClasspath
}

我试过运行 gradle run -h,但它不工作。

130748 次浏览

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

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

添加到任务定义中(参见 Dsl 文档)

然后你可以这样运行:

gradle -Ph run

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

您还应该阅读通过与 -D或与 -P之间的差异,这是解释 在格拉德尔的文件中

4.9 +

gradle run --args='arg1 arg2'

这假设你的 build.gradle配置了 应用程序插件。你的 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']"

抱歉这么晚才接电话。

我想到了一个和@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

如果您希望始终使用相同的参数集,以下就是您所需要的全部内容。

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

当然,以上所有的答案都起到了作用,但是我还是想使用类似于

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


}

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

限制:

  1. 我被迫使用“-”而不是“-”
  2. 您必须添加一些全局 init 脚本

如果您不喜欢全局 init 脚本,可以在命令行中指定它

gradle -I init.gradle run --- f:/temp/x.xml

或者在你的 shell 中添加一个别名:

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

自 Gradle 4.9以来,命令行参数可以用—— args 传递。例如,如果希望使用命令行参数 foo --bar启动应用程序,可以使用

Gradle run —— args = ‘ foo —— bar’

参见也分级应用插件

如何升级 Gradle 包装