profile可以定义一系列的配置信息,并可以为其指定激活条件。
比如,可以在JDK为某个版本时,激活某个profile;可以在某种操作系统下,激活某个profile;可以将某个profile设定为默认激活;也可以使用mvn命令的-P <profile-id>
显式的激活某个profile等。
这样就可以通过定义多个profile,并为它们指定不同的激活条件的方式,实现不同环境使用不同配置。
1,通过mvn的-P <profile-id>选项显式激活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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.timd.maven</groupId> <artifactId>MavenTest</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>MavenTest</name> <url>http://timd.cn/</url> <profiles> <profile> <id>prd</id> <properties> <pom.username>username_of_prd</pom.username> <pom.password>password_of_prd</pom.password> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>sim</id> <properties> <pom.username>username_of_sim</pom.username> <pom.password>password_of_sim</pom.password> </properties> </profile> <profile> <id>dev</id> <properties> <pom.username>username_of_dev</pom.username> <pom.password>password_of_dev</pom.password> </properties> </profile> </profiles> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/resources/</directory> <filtering>true</filtering> <includes> <include>**/*.properties</include> </includes> </resource> </resources> </build> </project>
其中,<build>的<resources>子元素用来指定主资源目录,<resource>的<filtering>子元素用来指定是否替换资源文件中的占位符。在default生命周期的process-resources阶段,maven会预处理主资源文件(比如变量替换),然后将其复制到主classpath下(默认是:target/classses/)。
本例中:
src/main/resources/目录下,只有一个文件:test.properties:
username=${pom.username} password=${pom.password}
使用mvn clean process-resources -P dev
激活id为dev的profile,命令执行完成之后:
$ cat target/classes/test.properties username=username_of_dev password=password_of_dev
同时,我们也可以看到在pom.xml中,使用<activeByDefault>元素将id为prd的profile设置成了默认激活,当没有任何其他的profile被激活时,就会激活该profile:
mvn clean process-resources
,命令执行完成之后:
$ cat target/classes/test.properties username=username_of_prd password=password_of_prd
2,根据环境激活profile
比如:
<profile> <id>jdk8</id> <activation> <jdk>1.8</jdk> </activation> <properties> <pom.username>username_of_jdk8</pom.username> <pom.password>password_of_jdk8</pom.password> </properties> </profile>
当JDK的版本为1.8时激活id为jdk8的profile
根据操作系统激活profile
根据系统属性激活profile
<profile> <id>prop</id> <activation> <property> <name>hello</name> <value>world</value> </property> </activation> <properties> <pom.username>username_of_prop</pom.username> <pom.password>password_of_prop</pom.password> </properties> </profile>
执行:mvn clean process-resources -Dhello=world
,命令完成之后:
$ cat target/classes/test.properties username=username_of_prop password=password_of_prop
<profile> <id>file</id> <activation> <file><missing>target</missing></file> </activation> <properties> <pom.username>username_of_notarget</pom.username> <pom.password>password_of_notarget</pom.password> </properties> </profile>
当target不存在时,会激活id为file的profile
<profile> <id>file</id> <activation> <file><exists>target</exists></file> </activation> <properties> <pom.username>username_of_target</pom.username> <pom.password>password_of_target</pom.password> </properties> </profile>
当target存在时,会激活id为file的profile
3,使用<activeProfiles>元素激活settings.xml中的profile
<profiles> <profile> <id>jdk</id> <properties> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion> </properties> </profile> </profiles> <activeProfiles> <activeProfile>jdk</activeProfile> </activeProfiles>
4,查看当前处于激活状态的profile
mvn help:active-profiles
Active Profiles for Project 'cn.timd.maven:MavenTest:jar:1.0-SNAPSHOT': The following profiles are active: - file (source: cn.timd.maven:MavenTest:1.0-SNAPSHOT)