在通过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
- 通过Eclipse错误运行Gradle项目“system can not find System Java Compiler”
- 在android studio中导入项目时得到“解决”错误,无法加载类“org.codehaus.groovy.runtime.typehandling.ShortTypeHandling'
- Android Studio更新后,Gradle项目刷新失败
- 用Gradle创build一个Groovy可执行JAR
- Gradle sourceCompatibility对子项目没有影响
- 将Gradle支持添加到IntelliJ Project的最佳方法
- 编译,提供,APK – Android依赖范围
- 如何使用Gradle创build发行版签名的apk文件?
- Module …不受gradle支持