在 Java 属性中使用 Groovy 进行变量扩展
Using Groovy for variable expansion in Java properties
我经常使用标准 Java 属性 文件来配置我的 Groovy 应用程序。我一直缺少的一个功能是能够将变量用作 属性 值的一部分,这样它们就可以在使用过程中动态扩展。我想我可以使用以下设计来提供此功能:
- 使用特殊的格式来注释应该扩展的属性。我选择用双感叹号 (!!) 将此类模板括起来。这些 属性 值本质上是一个模板,可以使用局部变量
进行扩展
- 在应用程序中使用属性之前,使用groovy'evaluate'方法在模板中扩展应用程序变量
- 在使用前将原来的属性键重新分配给新值
所以,如果我有一个 属性 文件 config.properties,其属性如下:
version=2.3
local_lib=!!${env['GROOVY_HOME']}/${configProps.getProperty('version')}/lib!!
local_lib属性将从GROOVY_HOME环境变量和版本属性值。
在我的应用程序中,我将其编码如下:
//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 方法为扩展 属性 returns 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]
造成这种差异的原因是什么?我本来希望 return 属性 地图中显示的值。
您的 local_lib
值看起来像 String
,但事实并非如此。它是一个 GString
,只是根据需要懒惰地强制为 String
(比如打印出 configProps
映射值时)。
因此,Properties.getProperty()
的一个鲜为人知的效果在这里生效。当实际映射值不是String时,Properties.getProperty()
returns null
.
因此,为了获得所需的行为,您需要在将值存储到 属性 映射之前将 GString
强制转换为 String
。像这样:
it.value=evaluate(valTemplate).toString()
或
it.value=evaluate(valTemplate) as String
然后您应该会在下游看到所需的结果。
我经常使用标准 Java 属性 文件来配置我的 Groovy 应用程序。我一直缺少的一个功能是能够将变量用作 属性 值的一部分,这样它们就可以在使用过程中动态扩展。我想我可以使用以下设计来提供此功能:
- 使用特殊的格式来注释应该扩展的属性。我选择用双感叹号 (!!) 将此类模板括起来。这些 属性 值本质上是一个模板,可以使用局部变量 进行扩展
- 在应用程序中使用属性之前,使用groovy'evaluate'方法在模板中扩展应用程序变量
- 在使用前将原来的属性键重新分配给新值
所以,如果我有一个 属性 文件 config.properties,其属性如下:
version=2.3
local_lib=!!${env['GROOVY_HOME']}/${configProps.getProperty('version')}/lib!!
local_lib属性将从GROOVY_HOME环境变量和版本属性值。
在我的应用程序中,我将其编码如下:
//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 方法为扩展 属性 returns 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]
造成这种差异的原因是什么?我本来希望 return 属性 地图中显示的值。
您的 local_lib
值看起来像 String
,但事实并非如此。它是一个 GString
,只是根据需要懒惰地强制为 String
(比如打印出 configProps
映射值时)。
因此,Properties.getProperty()
的一个鲜为人知的效果在这里生效。当实际映射值不是String时,Properties.getProperty()
returns null
.
因此,为了获得所需的行为,您需要在将值存储到 属性 映射之前将 GString
强制转换为 String
。像这样:
it.value=evaluate(valTemplate).toString()
或
it.value=evaluate(valTemplate) as String
然后您应该会在下游看到所需的结果。