說(shuō)明
assembly是個(gè)很好的打包工具,通俗講,我們可以用它把七零八落的一些文件按一定規(guī)則重新組織,打成個(gè)大包。
例如,一個(gè)工程依賴了好多個(gè)jar包,我們可以用它把所有依賴的jar包里的class提取出來(lái),重新組織成一個(gè)大jar包。
這時(shí)會(huì)遇到一個(gè)問題,如果原來(lái)jar里有同名文件,就會(huì)相互覆蓋,最終導(dǎo)致打出的jar包不可用。
spring.handlers、spring.schemas就是個(gè)例子。
很多jar包對(duì)spring的配置做擴(kuò)展,都會(huì)用這兩個(gè)文件定義XML的schemas和解析器。如果要合并成一個(gè)jar包,正確的做法是把所有的spring.handlers、spring.schemas合并,而非相關(guān)覆蓋。
配置
那么該如何做呢?
assembly提供了一個(gè)containerDescriptorHandlers配置可以解決這個(gè)問題。
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
....
<containerDescriptorHandlers>
<containerDescriptorHandler>
<handlerName>metaInf-spring</handlerName>
</containerDescriptorHandler>
</containerDescriptorHandlers>
</assembly>
如上,metaInf-spring會(huì)把所有META-INF/spring.*合并成一個(gè)大文件。
那其他文件呢?例如多個(gè)my.properties
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
....
<containerDescriptorHandlers>
<containerDescriptorHandler>
<handlerName>file-aggregator</handlerName>
<configuration>
<filePattern>.*/my.properties</filePattern>
<outputPath>my.properties</outputPath>
</configuration>
</containerDescriptorHandler>
</containerDescriptorHandlers>
</assembly>
如上,可以用file-aggregator,通過(guò)表達(dá)式方式合并所有my.properties為一個(gè)大文件。