env-specific的配置指的是系统的参数在不同环境下要使用不同的配置,比如jdbc依赖的数据库用户名/密码在开发环境跟在生产环境肯定是不一样的。
Maven为此提供的解决方案是:
1.参数以变量方式定义在resource目录下的配置文件中,如${db.url}, ${db.user}等
2.pom里设定不同环境下的值,并通过"profile"来标识不同的环境
<profiles> <profile> <id>dev</id> <properties> <db.url>jdbc:mysql:dev</db.url> ... </properties> </profile> <profile> <id>prod</id> <properties> <db.url>jdbc:mysql:prod</db.url> ... </properties> </profile> </profiles>
3.编译时,把配置文件中的变量替换成具体的值
a.首先要打开maven的resource filtering功能 (见maven-resource-plugin的配置说明)
b.编译时再指定profile,告诉Maven当前是哪个环境
mvn package
-Pdev
========================================
个人看来,这种解决方案还是相当弱的:
1.
不支持默认值。一个项目可能有几十个env-specific配置,如果不支持默认值,就意味着每个开发人员都得在本地定义这几十个配置;如果某人增加了一个配置并提交到公共分支,另一个人如果不知情,没有定义相应的值,在编译时Maven就无法为新的配置赋值,最后会把${xxx}带到构件中
2.
属性的赋值只能写在pom.xml或settings.xml里,导致很多不便
a.如果写在pom.xml里,由于pom.xml一般纳入了版本控制系统,这意味着张三和李四把pom.xml 签出来后,要再修改其中的dev profile以使它适应本机的配置,然而,这个文件又不准提交。这是出错的温床,也是烦恼之源。
b.如果写在各自的settings.xml里,又很容易出现多项目下,profile命名的撞车问题。比如某人同时开发两个项目,项目A定义了一个叫dev的profile, 项目B也定义了一个叫dev的profile,但settings.xml里又只能定义一个叫dev的profile,这咋办?