@
在maven 配置文件中引起的怪异现象
呈现问题
在maven 项目中大多会使用到resource 来替换配置文件(e.g. test_env.properties
)中的变量
db.url=${db.url}
warn.email=tom@ab.com, jim@bc.com, lili@bc.com
usercente.url=${usrcenter.url}
众所周知${}
可以用作占位符, 在mvn 的resoures 中会将占位符(${db.url}
) 中的内容替换。预期的结果应该是这样
db.url=mysql:jdbc://localhost:3306/test?useUnicode=true&characterset=utf8
warn.email=tom@ab.com, jim@bc.com, lili@bc.com
usercente.url=http://ucenter.mysite.com/auth
现实结果是这样的
db.url=mysql:jdbc://localhost:3306/test?useUnicode=true&characterset=utf8
warn.email=tom@ab.com, jim@bc.com, lili@bc.com
usercente.url=${usrcenter.url}
如果test_env.properties 修改下
db.url=${db.url}
#这里的邮箱是两个
warn.email=tom@ab.com, jim@bc.com
usercente.url=${usrcenter.url}
这时结果就是正确的
问题原因
在mvn resources 插件中默认配置了占位符, ${*}
或者 @@
, 我最熟悉的是${}
。 如果在prooperties 文件中使用@(使用email), resources 插件就会去找成对匹配的@
.
到这儿刚才的现象就可以解释了, 对于配置了奇数个email的情况:
warn.email=tom@ab.com, jim@bc.com, lili@bc.com
后面的占位符没有被替换. resources 插件尝试去找成对配置的@
( 一直到配置结尾,什么都没有找到)。 对于email 配置是偶数的情况,@
是成对的,然后后面的替换就顺利进行了。
解决办法
- 避免在应用配置文件中使用常量(可能误导resources),环境配置都写到filters 里边
- 把引入
@
的配置放到最后一行 - 修改resources 插件配置
<delimiters>
<delimiter>${*}</delimiter>
<!--<delimiter>@</delimiter> -->
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>?