11.3. 激活Profile

在之前的小节中我们介绍了如何为一个特定的目标环境创建一个profile以覆盖默认行为。前面的例子中默认的构建是针对开发环境设计的,而production profile的存在就是为了为产品环境提供配置。当你需要基于一些变量如操作系统和JDK版本来进行配置的时候怎么做呢?Maven提供了一种针对不同环境参数“激活”一个profile的方式,这就叫做profile激活。

看如下的例子,假设我们拥有一个Java类库,它有一个特定的功能只有在Java 6下才可用,它需要使用定义在JSR-223中的脚本引擎。你已经将那部分处理脚本的类库分离到了一个单独的Maven模块中,并且希望运行Java 5的人们能构建整个项目,而不去构建那部分针对Java 6的扩展类库。你可以使用一个Maven profile,只有构建在Java 6 JDK上运行的时候才将脚本扩展模块添加到构建中。首先,让我们看一下这个项目的目录布局,以及我们希望开发者如何构建该系统。

当有人使用Java 6 JDK运行mvn install的时候,你希望构建包含simple-script模块,而它们使用Java 5的时候,你希望跳过simple-script模块的构建。假如在Java 5下不能够跳过simple-script模块的构建,构建会失败因为Java 5的classpath中没有ScriptEngine。让我们看一下该类库项目的pom.xml

Example 11.3. 使用Profile激活动态包含子模块

<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.sonatype.mavenbook</groupId>
  <artifactId>simple</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>simple</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <profiles>
    <profile>
      <id>jdk16</id>
      <activation>
        <jdk>1.6</jdk>
      </activation>
      <modules>
        <module>simple-script</module>
      </modules>
    </profile>
  </profiles>
</project>

如果你在Java 1.6下运行mvn install,你会看到Maven下行到simple-script子目录构建simple-script项目。如果你在Java 1.5上运行mvn install,Maven就不会去构建simple-script子模块。让我们详细看一下激活配置:

1

activation元素列出了所有激活profile需要的条件。该例中,我们的配置为,当Java版本以“1.6”开头的时候profile会被激活。这包括“1.6.0_03”,“1.6.0_02”以及所有其它以“1.6”开头的字符串。激活参数不局限于Java版本,要了解激活参数的完整列表,请看激活配置

2

在这个profile中我们添加了模块simple-script。这么做会让Maven从simple-script/子目录中寻找一个pom.xml文件。

11.3.1. 激活配置

激活配置元素下可以包含一个或者多个选择器:包含JDK版本,操作系统参数,文件,以及属性。当所有标准都被满足的时候一个profile才会被激活。例如,一个profile可以要求操作系统家族为Windoes,JDK版本为1.4,那么该profile只有当构建在Windows机器上的Java 1.4上运行的时候才会被激活。如果该profile被激活,那么它定义的所有配置都会覆盖原来POM中对应层次的元素,就像使用命令行参数-P引入该profile一样。下面的例子展示了一个profile,它通过一个十分复杂的配置组合激活,包括操作系统参数,属性,以及JDK版本。

Example 11.4. Profile激活参数:JDK版本,操作系统参数,以及属性

<project>
  ...
  <profiles>
    <profile>
      <id>dev</id>
      <activation>
        <activeByDefault>false</activeByDefault>
        <jdk>1.5</jdk>
        <os>
          <name>Windows XP</name>
          <family>Windows</family>
          <arch>x86</arch>
          <version>5.1.2600</version>
        </os>
        <property>
          <name>mavenVersion</name>
          <value>2.0.5</value>
        </property>
        <file>
          <exists>file2.properties</exists>
          <missing>file1.properties</missing>
        </file>
      </activation>
      ...
    </profile>
  </profiles>
</project>


上例定义了一组狭小的激活参数集合。让我们仔细看一下每个激活配置:

1

activeByDefault元素控制一个profile是否默认被激活。

2

该profile只有当JDK版本以“1.5”开头的时候才被激活。这包含“1.5.0_01”,“1.5.1”等。

3

该profile针对于一个特定的Windowx XP版本,32位平台上的5.1.2600版本。如果你的项目使用本地插件来构建一个C程序,你可能会发现自己正为特定的平台编写项目。

4

property元素告诉Maven,当mavenVersion属性的值被设置成2.0.5的时候才激活profile。mavenVersion是一个在所有Maven构建中可用的隐式属性。

5

file元素告诉我们只有当某些文件存在(或者不存在)的时候才激活profile。该例中的dev profile只有在项目基础目录中存在file2.properties文件,并且不存在file1.properties文件的时候才被激活。