Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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 如何在ApacheCommons配置can';救不了_Java_Xml_Groovy_Apache Commons_Apache Commons Config - Fatal编程技术网

Java 如何在ApacheCommons配置can';救不了

Java 如何在ApacheCommons配置can';救不了,java,xml,groovy,apache-commons,apache-commons-config,Java,Xml,Groovy,Apache Commons,Apache Commons Config,我试图在groovy脚本中使用ApacheCommons配置从一个简单的属性文件中读取值,并用该文件中的值填充XML模板。本例的目标是能够使用属性文件中定义的设置启动多个Tomcat实例。 尽管ApacheCommons配置框架非常怪异,但之所以选择它,是因为它能够立即读取/写入/验证不同的配置类型 模板是tomcat的server.xml的一部分: <?xml version='1.0' encoding='utf-8'?> <Server port="${tomcat.se

我试图在groovy脚本中使用ApacheCommons配置从一个简单的属性文件中读取值,并用该文件中的值填充XML模板。本例的目标是能够使用属性文件中定义的设置启动多个Tomcat实例。 尽管ApacheCommons配置框架非常怪异,但之所以选择它,是因为它能够立即读取/写入/验证不同的配置类型

模板是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>
我使用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相同。e、 g.with port=“${tomcat.server.port}”
有什么方法可以用属性文件中的值保存它吗?

对生成器方法的深入研究和帮助找到了一种方法

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

很遗憾,谷歌没有将插值与替换和替换联系起来。

我建议你重新编写这个问题。了解一些您的用例是很有趣的,但是如果您创建一个简单的、可复制的示例并向我们展示,我们可能会更容易地帮助您。创建一个包含一个或两个元素的小XML文件,一个小属性文件,并向我们展示一个可以复制/编译/执行的文件,以查看问题。@Duncan,感谢您的建议。我已经更新了我的问题。
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")