maven 属性文件中使用 '@'

@ 在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 配置是偶数的情况,@ 是成对的,然后后面的替换就顺利进行了。

解决办法

  1. 避免在应用配置文件中使用常量(可能误导resources),环境配置都写到filters 里边
  2. 把引入@ 的配置放到最后一行
  3. 修改resources 插件配置
<delimiters>
  <delimiter>${*}</delimiter>
  <!--<delimiter>@</delimiter> -->
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>?

参考内容

apache mvn:resource

猜你喜欢

转载自blog.csdn.net/taozhen1987/article/details/80288337