如何保存填充了Apache Commons Configuration中属性文件中的值的xml配置无法保存

时间:2015-03-10 13:11:26

标签: java xml groovy apache-commons apache-commons-config

我正在尝试在groovy脚本中使用Apache Commons Configuration从简单属性文件中读取值,并使用该文件中的这些值填充XML模板。此示例的目标是能够使用属性文件中定义的设置启动多个Tomcat实例。 尽管选择了Apache Commons Configuration框架,但由于它能够立即读取/写入/验证不同的配置类型,因此选择了它。

模板是tomcat的server.xml:

<?xml version='1.0' encoding='utf-8'?>
<Server port="${tomcat.server.port}" shutdown="SHUTDOWN">
    <Service name="Catalina">
        <Connector port="${tomcat.http.port}"
                   address="${tomcat.http.ip}"/>
        <Engine jvmRoute="${tomcat.jvmroute}"/>
    </Service>
</Server>

和属性文件(让我们说tomcat.properties):

application=someapp
tomcat.server.port=8087
tomcat.http.port=8088
tomcat.jvmroute=${application}

我使用DefaultConfigurationBuilder将这些文件合并到配置中。 定义文件是动态创建的。代码:

import groovy.xml.MarkupBuilder
import org.apache.commons.configuration.*

String configurationDefinition = "tomcat.configuration.xml"
File configurationDefinitionFile = new File(configurationDefinition)
FileWriter configurationDefinitionWriter = new FileWriter(configurationDefinitionFile)
MarkupBuilder fileList = new MarkupBuilder(configurationDefinitionWriter)
fileList.configuration() {
    properties(fileName:'tomcat.properties')
    xml(fileName:'server.xml')
}
configurationDefinitionWriter.close()

DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
builder.setFile(configurationDefinitionFile);
Configuration propertiesConfig = builder.getConfiguration(true);
//propertiesConfig.getKeys().each {  propertyName ->
//    println("$propertyName = ${propertiesConfig.getString(propertyName)}")
//}

XMLConfiguration conf = (XMLConfiguration)propertiesConfig.getConfiguration(1)
//conf.getKeys().each {  propertyName ->
//    println("$propertyName = ${conf.getString(propertyName)}")
//}
conf.save("server_parsed.xml")

保存的文件与上面的server.xml相同。例如with port =“$ {tomcat.server.port}” 有没有办法用属性文件中的值保存它?

1 个答案:

答案 0 :(得分:0)

对构建器方法和userguide的深入研究有助于找到一种方法。

  

AbstractConfiguration提供了interpolatedConfiguration()方法。   此方法创建当前配置的克隆,然后   对其所有属性执行插值。所以结果就是这样   method是一个与内容基本相同的配置对象   原始配置,但所有变量都由他们替换   实际值(尽可能这样)。

所以下面的代码完美无缺:

import groovy.xml.MarkupBuilder
import org.apache.commons.configuration.*

String configurationDefinition = "tomcat.configuration.xml"
File configurationDefinitionFile = new File(configurationDefinition)
FileWriter configurationDefinitionWriter = new FileWriter(configurationDefinitionFile)
MarkupBuilder fileList = new MarkupBuilder(configurationDefinitionWriter)
fileList.configuration() {
    properties(fileName:'tomcat.properties')
    xml(fileName:'server.xml')
}
configurationDefinitionWriter.close()

DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
builder.setFile(configurationDefinitionFile);
Configuration propertiesConfig = builder.getConfiguration(true);

XMLConfiguration conf = (XMLConfiguration)propertiesConfig.getConfiguration(1)
XMLConfiguration  interpolatedConf = (XMLConfiguration )conf.interpolatedConfiguration()
interpolatedConf.save("server_parsed.xml")

令人遗憾的是谷歌没有将插值与替换和替换相关联。