11.7. 提示和技巧

Profile可以用来鼓励构建可移植性。如果你的构建需要为不同的平台做一些细微的自定义,或者如果你针对不同的目标平台生成不同的输出,项目profile就能增加构建可移植性。Settings profile通常会降低构建可移植性,因为它会添加一些必须在开发人员之间沟通的额外项目信息。下面的小节提供了一些如何在你项目中使用Maven profile的指导意见和想法。

11.7.1. 常见的环境

创建Maven项目profile的最核心动机之一就是为了提供环境特定的配置。在开发环境中,你可能想要生成带有调试信息的字节码,配置你的系统使用开发数据库实例。而在产品环境中,你可能会想要生成一个已签名的JAR,并且配置系统使用产品数据库。本章,我们使用devprod等标识符定义了很多环境。一种更简单的方式是,定义一些会被环境属性自动激活的profile,在你所有的项目中使用这些通用的环境属性。例如,如果每个项目都有一个development profile,当属性environment.type的值为dev时被激活,并且同样的项目还有production profile,当属性environment.type的值为prod时被激活。那么,你就可以在你的settings.xml中创建一个默认的profile,在你的开发机器上,总是将environment.type设置为dev。这样,所有定义了dev profile的项目都会由同样的系统变量激活。让我们看看如何完成这件事情,以下的~/.m2/settings.xml定义了一个profile,将environment.type属性设置成了dev

Example 11.9. ~/.m2/settings.xml 中定义一个设置了environment.type的默认profile,

<settings>
  <profiles>
    <profile>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <environment.type>dev</environment.type>
      </properties>
    </profile>
  </profiles>
</settings>


这意味着每次你在你机器上运行Maven的时候,该profile总会被激活,属性environment.type的值被设置为dev。之后你就可以使用这个属性来激活定义在某个如下项目pom.xml中的profile。让我们看一下如何在项目的pom.xml定义一个当属性environment.type的值为dev时被激活的profile。

Example 11.10. 项目profile,当environment.type等于'dev'时被激活

<project>
  ...
  <profiles>
    <profile>
      <id>development</id>
      <activation>
        <property>
          <name>environment.type</name>
          <value>dev</value>
        </property>
      </activation>
      <properties>
        <database.driverClassName>com.mysql.jdbc.Driver</database.driverClassName>
        <database.url>
          jdbc:mysql://localhost:3306/app_dev
        </database.url>
        <database.user>development_user</database.user>
        <database.password>development_password</database.password>
      </properties>
    </profile>
    <profile>
      <id>production</id>
      <activation>
        <property>
          <name>environment.type</name>
          <value>prod</value>
        </property>
      </activation>
      <properties>
        <database.driverClassName>com.mysql.jdbc.Driver</database.driverClassName>
        <database.url>jdbc:mysql://master01:3306,slave01:3306/app_prod</database.url>
        <database.user>prod_user</database.user>
      </properties>
    </profile>
  </profiles>
</project>


该项目定义了一些属性如database.urldatabase.user,它们可能被用来配置一些定义在pom.xml中的Maven插件。有很多可用的插件可以用来操作数据库,运行SQL,而且还有如Maven Hibernate3之类的插件可以帮你在使用持久化框架的时候生成注解模型对象。这其中的一些插件,可以在pom.xml中被配置成使用这些属性。这些属性还可以被用来过滤资源。本例中,因为我们在~/.m2/settings.xml中定义了一个profile,设置environment.typedev,在这台开发机器上运行Maven的时候,development profile就一直会被激活。做为选择,如果我们想要覆盖缺省值,我们可以在命令行设置这个属性值。如果我们需要激活production profile,我们可以如下运行Maven:

~/examples/profiles $ mvn install -Denvironment.type=prod

在命令行设置一个属性可以覆盖定义在~/.m2/settings.xml中的缺省值。我们可以仅仅定义一个id为"dev"的profile,然后直接使用-P命令行参数调用它,但是使用environment.type属性允许我们在编写其它项目的pom.xml时遵循这个标准。在你代码库中的每个项目都可以有一个profile,由定义在每个用户~/.m2/settings.xml中的项目的environment.type属性激活。这样,开发人员就能共享开发配置,而不用在不可移植的settings.xml文件中定义这些配置。