在通过Gradle运行Java类时传递系统属性和参数的问题

我试图通过Gradle运行一个命令行Java应用程序作为快速集成testing的一部分。 我正在从Maven移植我的构build脚本,在这里很容易通过exec-maven-plugin 。 我的两大要求是:

  • 能够将系统属性传递给可执行的Java代码
  • 能够将命令行parameter passing给可执行的Java代码

请注意,我不想在构build脚本中读取这些属性,我试图在脚本构build和执行的Java程序中读取它们。

我发现了另外两个SOpost,它们通过Gradle来解决Java程序的执行问题: 一个是提倡使用apply plugin: "application"构build文件中的apply plugin: "application"gradle run在命令行gradle run , 另一个则提供了支持这种方法的答案在构build文件中使用task execute(type:JavaExec) ,并在命令行gradle execute 。 我已经尝试了两种方法,没有成功。

我有两个问题:

(1)我无法获得Java可执行文件来读取系统属性

我是否这样做:

build.gradle

 apply plugin: 'application' mainClassName = "com.mycompany.MyMain" 

命令行

 gradle run -Dmyproperty=myvalue 

或这个:

build.gradle

 task execute (type:JavaExec) { main = "com.mycompany.MyMain" classpath = sourceSets.main.runtimeClasspath } 

命令行

 gradle execute -Dmyproperty=myvalue 

在这两种情况下,我的myproperty并没有通过。 从MyMain.main (...)开始运行的代码读取myproperty系统属性为空/缺失。

(2)我不能传递命令行参数

这可能与第一个问题有关。 例如,在exec-maven-plugin ,命令行参数本身是通过系统属性传入的。 这是Gradle的情况,还是有另一种方式来传递命令行参数?

我如何获得这些variables? 此外,使用apply plugin: 'application'更好apply plugin: 'application'task execute (type:JavaExec)

弄清楚了。 主要的问题是,当Gradle推出一个新的Java进程时,它不会自动将环境variables值传递给新的环境。 必须通过任务或插件的systemProperties属性显式传递这些variables。

另一个问题是理解如何通过命令行参数。 这些是通过任务或插件的args属性。 和Maven的exec-maven-plugin ,它们也应该通过另一个系统属性在命令行上传递,作为空格分隔的列表,然后在设置接受List对象的args之前需要先split() 。 我已经命名了属性exec.args ,这是旧的Maven名称。

看来这两个javaExec和应用程序插件的方法是有效的。 有人可能会喜欢应用程序插件的方法,如果你想使用其他一些function(自动放在一起发行等)

以下是解决scheme:

JavaExec方法

命令行

 gradle execute -Dmyvariable=myvalue -Dexec.args="arg1 arg2 arg3" 

build.gradle

 task execute (type:JavaExec) { main = "com.myCompany.MyMain" classpath = sourceSets.main.runtimeClasspath /* Can pass all the properties: */ systemProperties System.getProperties() /* Or just each by name: */ systemProperty "myvariable", System.getProperty("myvariable") /* Need to split the space-delimited value in the exec.args */ args System.getProperty("exec.args", "").split() } 

应用程序插件方法

命令行

 gradle run -Dmyvariable=myvalue -Dexec.args="arg1 arg2 arg3" 

build.gradle

 apply plugin: 'application' mainClassName = "com.mycompany.MyMain" run { /* Can pass all the properties: */ systemProperties System.getProperties() /* Or just each by name: */ systemProperty "myvariable", System.getProperty("myvariable") /* Need to split the space-delimited value in the exec.args */ args System.getProperty("exec.args", "").split() } 

对于那些不想通过传递不相关的Gradle道具来污染你的应用程序的系统属性的人,我推荐给你的参数命名。

 tasks.withType(JavaExec) { System.properties.each { k,v-> if (k.startsWith("prefix.")) { systemProperty k - "prefix.", v } } } 

java ... -Dprefix.my.prop=true会传递my.prop