我正在尝试在 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 相同。例如,使用 port="${tomcat.server.port}" 有没有办法用属性文件中的值保存它?