Liberty:配置元素合并规则
如果在服务器配置中多次指定某个配置元素,那么这些元素将合并。以下规则适用于配置合并:
- 单体元素始终合并。在以下示例中,服务器配置中该元素的所有实例为 featureManager,它们将合并为单个 featureManager 元素:
生效配置变为:<featureManager> <feature>servlet-3.0</feature> </featureManager><featureManager> <feature>jdbc-4.0</feature> </featureManager>
<featureManager> <feature>servlet-3.0</feature> <feature>jdbc-4.0</feature> </featureManager>
- 如果在服务器配置顶级指定的出厂元素具有相同标识,那么它们将合并。在以下示例中,带有 id= "ds1" 的 dataSource 元素将合并,带有 id= "ds2"
的 dataSource 元素将保持原样。例如,
生效配置变为:<dataSource id="ds1" jdbcDriverRef="myDriver"/> <dataSource id="ds1" jndiName="jdbc/myDriver"/> <dataSource id="ds2" jdbcDriverRef="myDriver2"/>
<dataSource id="ds1" jdbcDriverRef="myDriver" jndiName="jdbc/myDriver"/> <dataSource id="ds2" jdbcDriverDref="myDriver2"/>
- 如果出厂元素没有标识(即上例中的“id”) 值,那么它被视为与没有标识值的相同类型的其他元素不同。没有标识值的多个出厂元素不会合并到一起。在以下示例中,dataSource
不会合并,所以生效配置与指定配置相同:
生效配置变为:<dataSource jdbcDriverRef="myDriver"/> <dataSource jndiName="jdbc/myDriver"/>
<dataSource jdbcDriverRef="myDriver"/> <dataSource jndiName="jdbc/myDriver"/>
- 如果要合并的元素有冲突属性,那么所合并元素使用配置解析器遇到的最后一个值。在以下示例中,带有 id= "ds1"
的 dataSource 元素将合并,系统会使用 jdbcDriverRef="myDriver2" 而移除
jdbcDriverRef="myDriver"。
生效配置变为:<dataSource id="ds1" jdbcDriverRef="myDriver"/> <dataSource id="ds1" jdbcDriverRef="myDriver2"/>
<dataSource id="ds1" jdbcDriverRef="myDriver2"/>
- 如果出厂元素嵌套在另一元素下,那么它仅与同一生效父代下的其他元素合并。在以下示例中,带有 id= "ds1"
的 dataSource 元素将合并,properties.derby.embedded
id="props1" 元素与父代也为 dataSource id="ds1" 的其他 properties.derby.embedded
id="props1" 元素合并。
生效配置变为:<dataSource id="ds1"> <properties.derby.embedded id="props1" databaseName="myDB"/> </dataSource> <dataSource id="ds2"> <properties.derby.embedded id="props1" user="myUser"/> </dataSource> <dataSource id="ds1"> <properties.derby.embedded id="props1" createDatabase="create"/> </dataSource>
<dataSource id="ds1"> <properties.derby.embedded id="props1" databaseName="myDB" createDatabase="create"/> </dataSource> <dataSource id="ds2"> <properties.derby.embedded id="props1" user="myUser"/> </dataSource>
- 如果出厂元素嵌套在另一元素下,并且该出厂元素没有指定标识值,那么将根据嵌套元素的基数应用特殊规则。如果需要特定类型的多个嵌套元素,那么不会合并这些元素。但是,如果只需要一个嵌套元素,那么这些嵌套元素将合并到一起。例如,
生效配置变为:<topLevel> <multipleNested enabled="true"/> <multipleNested value="1"/> <singleNested enabled="false"/> <singleNested value="2"/> </topLevel>
<topLevel> <multipleNested enabled="true"/> <multipleNested value="1"/> <singleNested enabled="false" value="2"/> </topLevel>
- 如果两个出厂元素嵌套在另一元素下,并且它们的标识值不匹配,那么合并行为取决于嵌套元素的基数。如果需要多个嵌套元素,那么不会合并这些元素。如果只需要一个嵌套元素,那么这些嵌套元素将合并到一起,尽管它们的标识值有冲突。例如,
生效配置变为:<topLevel> <multipleNested id="1" enabled="true"/> <multipleNested id="2" value="1"/> <singleNested id="3" enabled="false"/> <singleNested id="4" value="2"/> </topLevel>
<topLevel> <multipleNested id="1" enabled="true"/> <multipleNested id="2" value="1"/> <singleNested id="4" enabled="false" value="2"/> </topLevel>