我经常使用标准 Java 属性文件来配置我的 Groovy 应用程序。我一直缺少的一项功能是能够使用变量作为属性值的一部分,以便它们可以在使用过程中动态扩展。我想我可以使用以下设计提供此功能:
- 使用特殊的格式来注释应该扩展的属性。我选择将此类模板用双感叹号 (!!) 括起来。这些属性值本质上是一个用局部变量扩展的模板
- 在应用程序中使用属性之前,请使用 groovy 'evaluate' 方法在模板中扩展应用程序变量
- 使用前将原来的属性键重新赋值为新值
所以,如果我有一个属性文件配置属性具有如下属性:
version=2.3
local_lib=!!${env['GROOVY_HOME']}/${configProps.getProperty('version')}/lib!!
The 本地库财产将从GROOVY_HOME环境变量和version适当的价值。
在我的应用程序中,我的编码如下:
//Load the environment variables and configuration file
env=System.getenv()
configFile=new File('config.properties')
configProps= new Properties()
configProps.load(configFile.newDataInputStream())
//Replace configuration property values with their expanded equivalent
configProps.each{
//if a property value is a template we evaluate it
if (it.value.startsWith('!!')){
valTemplate=it.value.replace('!!','"')
it.value=evaluate(valTemplate)
}
}
//then we use the expanded property values
这似乎有效。当我做
println configProps
我看到该值已扩展并且不为空
但是,那获取属性扩展属性的方法返回 null。
assert configProps.getProperty('local_lib')=='C:\\DEVTOOLS\\groovy-2.4.7/2.3/lib'
| | |
| null false
[local_lib:C:\DEVTOOLS\groovy-2.4.7/2.3/lib, version:2.3]
是什么造成了这种差异?我本来期望返回属性映射中显示的值。
Your local_lib
值看起来像String
,但事实并非如此。它是一个GString
,只是懒惰地强制String
根据需要(例如打印出configProps
地图值)。
因此,鲜为人知的效果Properties.getProperty()
在这里生效。当实际的map值不是String时,Properties.getProperty()
回报null
.
因此,为了获得所需的行为,您需要强制GString
to String
在将值存储在属性映射中之前。就像这样:
it.value=evaluate(valTemplate).toString()
or
it.value=evaluate(valTemplate) as String
然后您应该在下游看到所需的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)