《Maven实战》笔记 6.2 – env-specific的配置

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,这咋办? 

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.