maven的resources插件,有一个filter的作用,能够在打包的时候,从特定文件里读取key-value对,替换配置文件中的占位符变量。很多线上线下有不同环境的应用,都是用这种方式来打包,只需要在文件中配置不同的值即可。

下面就是一个最简单的配置:

<build>
    <finalName>Test</finalName>
    <filters>
        <filter>${user.home}/antx.properties</filter>
    </filters>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

上面的配置,会读取${user.home}/antx.properties文件里的k-v对,然后将src/main/resources下的文件中,${var_name}形式的变量都替换成antx.properties里对应key的值。

当然,如果你的resources不仅仅是xml配置文件,你可能还希望加上<includes></includes>或者<excludes></excludes>配置段来限制替换的文件类型。


今天在打包项目的时候,发现有一个xml文件,被替换了一半变量值,而在公司的daily机器上却是正常的,非常奇怪。

刚开始以为是编码的问题,将所有xml文件统一改成GBK(web项目,是GBK编码的),无果。

接着怀疑是antx.properties文件的问题,打开仔细看,把不可见字符也显示出来,也没看出问题。后来索性直接把其他机器上OK的antx.properties文件复制过来重新打包,也没解决问题。

没办法,只好针对配置文件,逐个删除来排查。最后终于定位到,有一个bean的配置,有个email的参数,填了xxx@xxx.com的值,一旦有了它,下面的变量便无法被替换。这时忽然想起上次解决另外一个项目的中文问题时上网查到的,maven 3.0的resources plugin对配置文件中有”@“符号的情况,有bug,会导致变量无法被替换。。。排查了大半天,最后知道真相的我眼泪掉下来啊。。。

解决办法很简单,不需要什么hack技巧,只要把包含@符号的配置移到最后面就可以了。。。

最后,排查中还有一个小技巧,不要用mvn install或者mvn package这种操作来重新运行,因为会很慢很耗时,直接用mvn resources:resources就可以了,它只复制&替换配置目录下的文件,非常地快。