在Java属性中使用Groovy进行变量扩展
我经常使用标准Java属性文件来配置Groovy应用程序。我一直缺少的一个特性是能够将变量作为属性值的一部分使用,以便在使用过程中动态扩展它们。我认为我可以使用以下设计提供此功能:在Java属性中使用Groovy进行变量扩展,java,groovy,properties-file,variable-expansion,Java,Groovy,Properties File,Variable Expansion,我经常使用标准Java属性文件来配置Groovy应用程序。我一直缺少的一个特性是能够将变量作为属性值的一部分使用,以便在使用过程中动态扩展它们。我认为我可以使用以下设计提供此功能: 使用特殊格式注释应展开的特性。我选择用双感叹号(!!)括住这些模板。这些属性值本质上是一个用局部变量展开的模板 在应用程序中使用属性之前,请使用groovy“evaluate”方法在模板中展开应用程序变量 使用前,将原始属性键重新指定给新值 因此,如果我有一个属性文件config.properties,其属性如下:
version=2.3
local_lib=!!${env['GROOVY_HOME']}/${configProps.getProperty('version')}/lib!!
local_lib属性将从GROOVY_HOME环境变量和version属性值展开
在我的申请中,我将其编码如下:
//加载环境变量和配置文件
env=System.getenv()
configFile=新文件('config.properties')
configProps=新属性()
configProps.load(configFile.newDataInputStream())
//用扩展的等效值替换配置属性值
配置每一个{
//如果属性值是一个模板,我们将对其求值
if(it.value.startsWith('!!')){
valTemplate=it.value.replace(“!!”和“”)
it.value=evaluate(valTemplate)
}
}
//然后我们使用扩展的属性值
这似乎管用。当我这样做的时候
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]
造成这种差异的原因是什么?我本来希望返回属性映射中显示的值。您的
local_lib
值看起来像字符串,但它不是。它是GString
,只是根据需要惰性地强制为String
(如打印configProps
映射值时)
因此,Properties.getProperty()
的一个鲜为人知的效果在这里生效。当实际映射值不是字符串时,Properties.getProperty()
返回null
因此,为了获得所需的行为,在将值存储到属性映射中之前,需要将GString
强制为String
。如下所示:
it.value=evaluate(valTemplate).toString()
或
然后您将看到下游所需的结果。顺便说一句,正是出于这个原因,我避免在Groovy中使用Properties.getProperty()和Properties.setProperty()。我更喜欢在处理Properties对象时使用映射语法和语义。噢,事实上@BalRog强制使用字符串解决了这个问题。谢谢!
it.value=evaluate(valTemplate) as String