Gradle不收集以-D

时间:2017-09-27 11:38:47

标签: spring-boot gradle groovy

这是Gradle还是Groovy错误?

我想将JVM参数从Gradle传递到分叉JVM,遗憾的是,这些JVM参数不是自动完成的。这应该有效,build.gradle

...
bootRun {
   jvmArgs = System.properties.iterator().findAll{it.key.startsWith('myapp')}.collect {
     "-D${it.key}=${it.value}"}
}
...

执行如下:

 gradle bootRun -Dmyapp.port=34501 -Dmyapp.member.name=server1

如果字符串以collect开头,方法-D将始终返回空收集。如果它以其他任何东西开头,则返回预期的两个元素String集合。如果我在-D之前放置空格它也可以工作,但它会在:findMainClass误解-Dmyapp.port=...主要类名的下游进一步打破构建。它只需从-D开始。

我也尝试了不同的字符串连接,但结果是以-D开头的字符串,它不起作用。

这是一个错误还是我错过了一些东西。这是我的第一个Gradle项目,我不是Groovy开发人员。 我应该报告是bug吗?在哪里,Groovy还是Gradle?

注意: 我正在从IntelliJ IDE 2016.1.2运行Gradle 使用Gradle 3.5
Forked JVM运行Spring Boot应用程序

更新
很抱歉,我的坏!事实是,使用上面的公式传递JVM参数 ;问题在于我测量它是如何测量的。我只是把打印输出:

 println "jvmArgs: ${jvmArgs}"
 println "jvmArgs.size: ${jvmArgs.size}"
 println "jvmArgs.class: ${jvmArgs.class}"

..并在jvmArgs.size == 0中止bootRun,以避免应用程序启动缓慢;那就是我没有真正检查参数是否在应用程序本身中传递。事实证明他们是。

仅供参考,产出为:

 jvmArgs: []
 jvmArgs.size: 0
 jvmArgs.class: java.lang.ArrayList

jvmArgs类报告为标准ArrayList,但行为更像输入流使用者,无论jvmArgs分配给哪个数组,都会扫描该数组以“-D”开头的所有字符串那些消耗(通过什么?),传递给一些ProcessBuilder(??),jvmArgs只留下剩余的元素。

举个例子:

 jvmArgs = ["-Daaa=bbb", "foo", "bar"]
 jvmArgs = ["stuff", "-Dccc=ddd", "morestuff"]
 jvmArgs = ["-Deee=fff"]
 println "jvmArgs: ${jvmArgs}"

..它打印jvmArgs: [],并使用-Daaa=bbb -Dccc=ddd -Deee=fff启动Spring Boot应用程序。

有人可以解释是什么导致这个神奇的流像jvmArgs的属性,否则声称是一个简单的ListArray?

1 个答案:

答案 0 :(得分:0)

这对我有用,但我对观察到的行为没有解释。希望它无论如何都有帮助。

def array = System.properties.iterator().findAll{
   it.key.startsWith('myapp')
}.collect {
   "-D${it.key}=${it.value}"
}
jvmArgs.addAll(array)

修改

jvmArgs = [“value”]调用setJvmArgs,如果我没有遗漏某些东西,则从JavaExec到JavaExecHandleBuilder以及后来的JvmOptions。这里,一些参数被删除。以-D开头的条目将被添加到systemproperties中。

setJvmArgs( ["-Dtest=1", "xx"])
println getJvmArgs() //[xx]
println systemProperties //[test:1]

您的应用程序是否无法访问该属性?

https://github.com/gradle/gradle/blob/master/subprojects/core/src/main/java/org/gradle/process/internal/JvmOptions.java#L183

编辑:背景中发生了什么

在Groovy中,属性赋值调用setter,访问它将调用getter。它们是可以互换的。如果省略setter和getter对,它将为您生成并在字节码中可见。但你甚至可以省略属性本身,只编写getter和setter对并将其用作属性。

class Foo {
   def setBar(String foo) {println "no thanks"}
   String getBar() {"test"}
}
f = new Foo()
f.bar="write Var" // println "no thanks"
println f.bar instanceof String // --> f.getBar() inst... true
println f.bar // 

因此,您从未将List分配给变量,而是调用setJvmArgs(List)。您可以使用getAllJvmArgs()btw列出所有参数。

结合委托策略和动态属性/方法,这可能是DSL编程的祝福,但是调试的诅咒......

http://groovy-lang.org/style-guide.html#_getters_and_setters 和google for groovy propertyMissing / groovy metaprogramming / groovy Resolve Strategies如果你想了解更多关于这个主题的信息。