【发布时间】:2018-03-08 21:14:24
【问题描述】:
这是 Gradle 还是 Groovy 错误?
我想将 JVM 参数从 Gradle 传递到分叉的 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
如果字符串以-D 开头,方法collect 总是返回空集合。如果它以其他任何内容开头,则返回预期的两个元素字符串集合。如果我在-D 之前放置空间,它也可以工作,但是它会在:findMainClass 上进一步破坏下游的构建,并用主类名误解-Dmyapp.port=...。它只需以-D 开头。
我也尝试了不同的字符串连接,但结果是一个以 -D 开头的字符串,它不起作用。
这是一个错误还是我遗漏了什么。这是我的第一个 Gradle 项目,我不是 Groovy 开发人员。 我应该报告错误吗?在哪里,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: [] 并且 Spring Boot 应用程序以 -Daaa=bbb -Dccc=ddd -Deee=fff 启动。
有人能解释一下是什么原因导致这个神奇的流类似于 jvmArgs 的属性,否则它声称是一个简单的 ListArray?
【问题讨论】:
-
这绝对不是一个错误——它早就被发现了。你如何运行gradle?从控制台,哪个外壳?或者可能来自 IDE。
-
你是对的,它一直有效,请阅读我的解释。奇怪的行为似乎是设计使然。
标签: spring-boot gradle groovy