使用maven实现:不同环境使用不同配置

profile简介

profile可以定义一系列的配置信息,并可以为其指定激活条件。
比如,可以在JDK为某个版本时,激活某个profile;可以在某种操作系统下,激活某个profile;可以将某个profile设定为默认激活;也可以使用mvn命令的-P <profile-id>显式的激活某个profile等。
这样就可以通过定义多个profile,并为它们指定不同的激活条件的方式,实现不同环境使用不同配置。

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>
    <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)