在之前的小节中我们介绍了如何为一个特定的目标环境创建一个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
子模块。让我们详细看一下激活配置:
|
|
在这个profile中我们添加了模块 |
激活配置元素下可以包含一个或者多个选择器:包含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>
上例定义了一组狭小的激活参数集合。让我们仔细看一下每个激活配置: