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