【发布时间】:2016-12-26 14:06:06
【问题描述】:
我经常使用标准 Java 属性文件来配置我的 Groovy 应用程序。我一直缺少的一个功能是能够使用变量作为属性值的一部分,以便它们可以在使用过程中动态扩展。我认为我可以使用以下设计来提供此功能:
- 使用特殊格式注释应扩展的属性。我选择用双感叹号 (!!) 将此类模板括起来。这些属性值本质上是一个模板,可以使用局部变量进行扩展
- 在应用程序中使用属性之前,使用 groovy 'evaluate' 方法在模板中展开应用程序变量
- 使用前将原始属性键重新分配给新值
所以,如果我有一个属性文件 config.properties,其属性如下:
version=2.3
local_lib=!!${env['GROOVY_HOME']}/${configProps.getProperty('version')}/lib!!
local_lib 属性将从 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
我看到值被扩展而不是空
但是,扩展属性的 getProperty 方法返回 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]
造成这种差异的原因是什么?我本来希望返回属性映射中显示的值。
【问题讨论】:
标签: java groovy properties-file variable-expansion