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>
- 指定在伺服器配置最上層的 Factory 元素,如果具有相同 ID,則會加以合併。在下列範例中,會合併具有 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"/>
- 如果 Factory 元素沒有 ID 值,會視為有別於相同類型但沒有 ID 值的其他元素。不會將沒有 ID 值的多個 Factory 元素合併在一起。在下列範例中,不會合併 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"/>
- 如果 Factory 元素以巢狀方式放在另一個元素之下,則會與同一有效母項之下的其他元素合併。在下列範例中,會合併具有 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>
- 如果 Factory 元素以巢狀形式放置在另一元素底下,且 Factory 元素沒有指定 ID 值,則會視巢狀元素的基數,套用特殊的規則。如果預期特定類型的巢狀元素會有多個,則不會合併這些元素。不過,如果預期只有單一巢狀元素,會將巢狀元素合併在一起。例如,
有效的配置變成:<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>
- 若有兩個 Factory 元素以巢狀形式放置在另一元素底下,且其 ID 值不相符,則合併行為取決於巢狀元素的基數。如果預期會有多個巢狀元素,則不會合併這些元素。如果預期只有單一巢狀元素,儘管 ID 值有衝突,也會將巢狀元素合併在一起。例如,
有效的配置變成:<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>