groovy错误地将“ off”推断为布尔值而不是字符串

时间:2019-05-03 17:11:15

标签: groovy

我在groovy中有一个Jenkinsfile脚本,它正在处理Java应用程序的application.properties文件,我刚刚用

将其添加到该文件中。
spring.main.banner-mode: off

在脚本中,我使用Jenkins外接程序库application.propertiesyamlRead文件读入内存中的映射,然后再次将值输出到另一个文件中,但结果为:

spring.main.banner-mode: false

这会在启动时中断Java程序,并显示讨厌的spring boot错误。 spring boot变量期望为OFF,FILE或CONSOLE。

我无法更改yamlRead,但可以更改如下所示的输出脚本:

yaml.each {
    key, value -> B: {
            // some processing...
            sh "echo '$base$key=$value' >> $file"
        }
    }
}

如何确定地图实际上是否具有布尔类型(因为我无法更改它,所以这很不好)还是不希望的布尔值转换发生在myy echo >> file中?

或者我能以某种方式强迫groovy在读取输入时不推断布尔值吗,也许在“ off”前后加上引号?

2 个答案:

答案 0 :(得分:4)

一切正常。 Groovy不是您的问题,它是YAML。 YAML参考资料指出,如您在此处看到的,“ off”被解释为“ false”

https://yaml.org/refcard.html

Jenkins yamlRead读取'off'并将其转换为值为'false'的布尔值。

答案 1 :(得分:1)

如Thomas所写:off是布尔值false的yaml格式的保留字

不过,您可以引用它来将其强制为字符串:

spring.main.banner-mode: 'off'

在这种情况下,spring.main.banner-mode键将具有字符串值off

要检查布尔值false,可以使用类似以下内容的方法:

yaml.each {
    key, value -> B: {
        // some processing...
        sh "echo '$base$key=${ value==false? 'off' : value }' >> $file"
    }
}

PS: 而不是调用sh将一个键值附加到文件,您可以使用以下代码:

def values = yaml.collect{k,v-> "$k=$v"}.join("\n")
writeFile( file: file, text: values )