Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java属性中使用Groovy进行变量扩展_Java_Groovy_Properties File_Variable Expansion - Fatal编程技术网

在Java属性中使用Groovy进行变量扩展

在Java属性中使用Groovy进行变量扩展,java,groovy,properties-file,variable-expansion,Java,Groovy,Properties File,Variable Expansion,我经常使用标准Java属性文件来配置Groovy应用程序。我一直缺少的一个特性是能够将变量作为属性值的一部分使用,以便在使用过程中动态扩展它们。我认为我可以使用以下设计提供此功能: 使用特殊格式注释应展开的特性。我选择用双感叹号(!!)括住这些模板。这些属性值本质上是一个用局部变量展开的模板 在应用程序中使用属性之前,请使用groovy“evaluate”方法在模板中展开应用程序变量 使用前,将原始属性键重新指定给新值 因此,如果我有一个属性文件config.properties,其属性如下:

我经常使用标准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