maven filter簡介
maven的resources插件,有一個filter的作用,能夠在打包的時候,從特定文件里讀取key-value對,替換配置文件中的占位符變量。很多線上線下有不同環境的應用,都是用這種方式來打包,只需要在文件中配置不同的值即可。
下面就是一個最簡單的配置:
<build> <finalName>Test</finalName> <filters> <filter>src/main/filters/${conf-dir}.properties</filter> </filters> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
上面的配置,會讀取src/main/filters/${conf-dir}.properties文件里的k-v對,然后將src/main/resources下的文件中,${var_name}形式的變量都替換成${conf-dir}.properties里對應key的值。注意:不會替換src/main/java下的文件里的${var_name}!
當然,如果你的resources不僅僅是xml配置文件,你可能還希望加上<includes></includes>或者<excludes></excludes>配置段來限制替換的文件類型。
maven filter踩到的坑
今天在打包項目的時候,發現有一個xml文件,被替換了一半變量值,非常奇怪。
萬水千山,終於找到原因:maven 3.0的resources plugin對配置文件中有”@“符號的情況有bug,會導致變量無法被替換。
舉例:
以下方式打包不會替換${smtpProtocol}和${smtpHost}
以下方式打包會替換${smtpProtocol}和${smtpHost}
結論
不要在被替換行里包括有@符號!
技巧
最后,排查中還有一個小技巧,不要用mvn install或者mvn package這種操作來重新運行,因為會很慢很耗時,直接用mvn clean resources:resources就可以了,它只復制&替換配置目錄下的文件,非常地快。
參考資料
http://blog.csdn.net/inte_sleeper/article/details/10128041