这是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?
答案 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]
您的应用程序是否无法访问该属性?
编辑:背景中发生了什么
在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如果你想了解更多关于这个主题的信息。