簡體   English   中英

如何保存用Apache Commons Configuration中的屬性文件中的值填充的xml配置無法保存

[英]How to save xml configuration filled with values from properties file in Apache Commons Configuration can't save

我試圖在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}”可以用屬性文件中的值保存它嗎?

建設者方法的進一步研究和userguide幫助找出一個辦法做到這一點。

AbstractConfiguration提供了interpolatedConfiguration()方法。 此方法創建當前配置的副本,然后對其所有屬性執行插值。 因此,此方法的結果是一個配置對象,其內容與原始配置基本相同,但是所有變量都被其實際值替換(在可能的情況下)。

因此,以下代碼非常完美:

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")

遺憾的是,谷歌沒有將插值與替換和替換相關聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM