Maven 项目通常都会有多个不同的运行环境,例如开发环境,测试环境、生产环境等。在不同环境的构建过程很可能是不同的,例如数据源配置、插件、以及依赖的版本等。

将项目部署到不同的环境时,都需要修改相应的配置,这样重复的工作,不仅浪费劳动力,还容易出错。为了解决这一问题,Maven 引入了 Profile 的概念,通过它可以为不同的环境定制不同的构建过程。

1. Profile 的类型

    Profile 可以分为 3 个类型,它们的作用范围也各不相同。

类型 位置 有效范围
Per Project Maven 项目的 pom.xml 中 只对当前项目有效
Per User 用户主目录(%USER_HOME%)/.m2/settings.xml 中 对本机上该用户所有 Maven 项目有效
Global Maven 安装目录(%MAVEN_HOME%)/conf/settings.xml 中 对本机上所有 Maven 项目有效

 

2. 声明 Profile

    Maven 通过 profiles 元素来声明一组 Profile 配置,该元素下可以包含多个 profile 子元素,每个 profile 元素表示一个 Profile 配置。

    每个 profile 元素中通常都要包含一个 id 子元素,该元素是调用当前 Profile 的标识。

    Profile 的定义形式如下:

复制代码

 1         <profiles> 2             <profile> 3                 <id>profile id</id> 4                 .... 5             </profile> 6             <profile> 7                 <id>profile id</id> 8                 .... 9             </profile>10         </profiles>

复制代码

    在 pom.xml 中声明的 Profile,由于其能够随着 pom.xml 一起存在,它被提交到代码仓库中,被 Maven 安装到本地仓库或远程仓库中,所以它能够修改或增加很多 POM 元素,其中常用的元素如下表。

    在 setting.xml 中声明的 Profile 是无法保证能够随着 pom.xml 一起被分发的,因此 Maven 不允许用户在该类型的 Profile 修改或增加依赖或插件等配置信息,它只能声明以下范围较为宽泛的元素。

        (1) repositories:仓库配置。
        (2) pluginRepositories:插件仓库配置。
        (3) properties:键值对,该键值对可以在 pom.xml 中使用。

    除此之外,Profile 中还可以声明一些其他的 POM 元素,但不同位置的 Profile 所能声明的 POM 元素也是不同的。

        (1) 一级元素 <project> 下的 Profile 支持的子元素

            repositories    
            pluginRepositories    
            dependencies    
            plugins    
            dependencyManagement    
            distributionManagement    
            modules    
            properties    
            reporting
            build

        (2) 二级元素 <build> 下的 Profile 支持的子元素

            plugins
            defaultGoal
            resources
            testResources
            directory
            filters
            finalName
            pluginManagement
            filters           

3. 激活 Profile

    Profile 能够在项目构建时,修改 POM 中配置或者添加一些额外的配置元素。用户可以通过多种方式激活 Profile,以实现不同环境使用不同的配置,执行不同的构建过程。

    Profile 可以通过以下 6 种方式激活:

        (1) 命令行激活
        (2) settings.xml 文件显示激活
        (3) 系统属性激活
        (4) 操作系统环境激活
        (5) 文件存在与否激活
        (6) 默认激活      

    示例

    本文在 “Maven基础知识(4)- Maven 插件、Maven Archetype (原型/模板)、Maven SNAPSHOT (快照)” 里 MavenDemo03 项目基础上,分别对以上 6 种激活方式进行讲解。

    1) 修改 MavenDemo03 项目

        在 src/main/resources 目录(手动创建该目录,下同)下创建 3 个环境 properties 配置文件。

            env.properties:默认配置文件
            env.test.properties:测试环境配置文件
            env.prod.properties:生产环境配置文件

            注:在三个配置文件添加不同的配置信息。

        在 pom.xml 里定义三个不同的 Profile,并将 maven-antrun-plugin:run 目标绑定到 default 生命周期的 test 阶段上,以实现在不同的 Profile 中进行不同的操作。

复制代码

  1             <project xmlns="http://maven.apache.org/POM/4.0.0"  2                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  3                     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  4                                         https://maven.apache.org/xsd/maven-4.0.0.xsd">  5   6                 <modelVersion>4.0.0</modelVersion>  7                 <groupId>com.example</groupId>  8                 <artifactId>MavenDemo03</artifactId>  9                 <version>1.0-SNAPSHOT</version> 10                 <packaging>jar</packaging> 11  12                 <dependencies> 13                     <dependency> 14                         <groupId>junit</groupId> 15                         <artifactId>junit</artifactId> 16                         <version>3.8.1</version> 17                         <scope>compile</scope> 18                     </dependency> 19                 </dependencies> 20  21                 <profiles> 22  23                     <!-- 默认环境配置 --> 24                     <profile> 25                         <id>default</id> 26                         <build> 27                             <plugins> 28                                 <plugin> 29                                     <groupId>org.apache.maven.plugins</groupId> 30                                     <artifactId>maven-antrun-plugin</artifactId> 31                                     <version>1.8</version> 32                                     <executions> 33                                         <execution> 34                                             <phase>test</phase> 35                                             <goals> 36                                                 <goal>run</goal> 37                                             </goals> 38                                             <configuration> 39                                                 <tasks> 40                                                     <echo>使用 env.properties,将其复制到 classpath</echo> 41                                                     <copy file="src/main/resources/env.properties" tofile="${project.build.outputDirectory}/user.properties"/> 42                                                 </tasks> 43                                             </configuration> 44                                         </execution> 45                                     </executions> 46                                 </plugin> 47                             </plugins> 48                         </build> 49                     </profile> 50  51                     <!-- test 环境配置 --> 52                     <profile> 53                         <id>test</id> 54                         <activation> 55                             <property> 56                                 <name>env</name> 57                                 <value>test</value> 58                             </property> 59                         </activation> 60                         <build> 61                             <plugins> 62                                 <plugin> 63                                     <groupId>org.apache.maven.plugins</groupId> 64                                     <artifactId>maven-antrun-plugin</artifactId> 65                                     <version>1.8</version> 66                                     <executions> 67                                         <execution> 68                                             <phase>test</phase> 69                                             <goals> 70                                                 <goal>run</goal> 71                                             </goals> 72                                             <configuration> 73                                                 <tasks> 74                                                     <echo>使用 env.test.properties,将其复制到 classpath</echo> 75                                                     <copy file="src/main/resources/env.test.properties" tofile="${project.build.outputDirectory}/user.properties"/> 76                                                 </tasks> 77                                             </configuration> 78                                         </execution> 79                                     </executions> 80                                 </plugin> 81                             </plugins> 82                         </build> 83                     </profile> 84  85                     <!-- 生产环境配置 --> 86                     <profile> 87                         <id>prod</id> 88                         <build> 89                             <plugins> 90                                 <plugin> 91                                     <groupId>org.apache.maven.plugins</groupId> 92                                     <artifactId>maven-antrun-plugin</artifactId> 93                                     <version>1.8</version> 94                                     <executions> 95                                         <execution> 96                                             <phase>test</phase> 97                                             <goals> 98                                                 <goal>run</goal> 99                                             </goals>100                                             <configuration>101                                                 <tasks>102                                                     <echo>使用 env.prod.properties,将其复制到 classpath</echo>103                                                     <copy file="src/main/resources/env.prod.properties" tofile="${project.build.outputDirectory}/user.properties"/>104                                                 </tasks>105                                             </configuration>106                                         </execution>107                                     </executions>108                                 </plugin>109                             </plugins>110                         </build>111                     </profile>112                 </profiles>113             </project>

复制代码

    2) 命令行激活
        在命令行中使用 mvn 命令行参数 -P 加上 Profile 的 id 来激活 Profile,多个 id 之间使用逗号隔开。

        打开 cmd 命令行窗口,进入 D:\Workshop\maven\MavenDemo03 目录,执行如下命令:

            D:\Workshop\maven\MavenDemo03>mvn clean test -Ptest

        显示结果如下:

复制代码

            ...

            [INFO]
            [INFO] --- maven-antrun-plugin:1.8:run (default) @ MavenDemo03 ---
            [WARNING] Parameter tasks is deprecated, use target instead
            [INFO] Executing tasks

            main:
                [echo] 使用 env.test.properties,将其复制到 classpath
                [copy] Copying 1 file to D:\Workshop\maven\MavenDemo03\target\classes
            [INFO] Executed tasks
            [INFO] ------------------------------------------------------------------------
            [INFO] BUILD SUCCESS
            [INFO] ------------------------------------------------------------------------
            [INFO] Total time:  5.936 s
            [INFO] Finished at: 2022-06-07T18:55:09+08:00
            [INFO] ------------------------------------------------------------------------

复制代码

    3) settings.xml 文件显示激活

        在本地仓库的 settings.xml 文件中添加如下配置,激活指定的 Profile。

复制代码

1     <settings>2 3       ...4           <activeProfiles>5                <activeProfile>test</activeProfile>6           </activeProfiles>7 8     </settings>

复制代码

 

        Maven 本地仓库的 settings.xml 文件,默认位于 %USER_HOME%/.m2 目录下,本文所在路径是 C:\Applications\java\apache-maven-3.8.1\conf\settings.xml。

        打开 cmd 命令行窗口,进入 D:\Workshop\maven\MavenDemo03 目录,执行如下命令:

            D:\Workshop\maven\MavenDemo03>mvn clean test

        显示结果如下:

            略

    4) 系统属性激活

        用户可以配置当某个系统属性存在时,激活指定的 Profile。例如,在 id 为 prod 的 profile 元素中添加以下配置,表示当系统属性 user 存在,且值等于 prod 时,自动激活该 Profile。

复制代码

 1     <profile> 2  3       <id>prod</id> 4           <activation> 5             <property> 6                  <name>user</name> 7                    <value>prod</value> 8              </property> 9           </activation>10 11       ...12 13     </profile>

复制代码

 

        打开 cmd 命令行窗口,进入 D:\Workshop\maven\MavenDemo03 目录,执行如下命令:

            D:\Workshop\maven\MavenDemo03>mvn clean test -Duser=prod

        显示结果如下:

            略

    5) 操作系统环境激活

        Maven 还可以根据操作系统环境自动激活指定的 Profile。例如,将以下配置(本地计算机操作系统环境信息)添加到 pom.xml 文件中的 id 为 default 的 Profile 中。

复制代码

 1   <profile> 2     <id>default</p> 3        <activation> 4             <os> 5                 <name>Windows 10</name> 6                 <family>Windows</family> 7                 <arch>amd64</arch> 8                 <version>10.0</version> 9             </os>10         </activation>11         ...12 13   </profile>

复制代码

 

        打开 cmd 命令行窗口,进入 D:\Workshop\maven\MavenDemo03 目录,执行如下命令:

            D:\Workshop\maven\MavenDemo03>mvn clean test

        显示结果如下:

            略

    6) 文件存在与否激活

        Maven 可以根据某些文件存在与否,来决定是否激活 Profile。例如,在 id 为 prod 的 Profile 中添加以下配置,该配置表示当 env.prod.properties 文件存在,且 env.test.properties 文件不存在时,激活该 Profile。

复制代码

 1             <profile> 2                 <id>prod</id> 3                 <activation> 4                     <file> 5                         <exists>./src/main/resources/env.prod.properties</exists> 6                         <missing>./src/main/resources/env.test.properties</missing> 7                     </file> 8                 </activation> 9                 ...10             11             </profile>

复制代码

        打开 cmd 命令行窗口,进入 D:\Workshop\maven\MavenDemo03 目录,执行如下命令:

            D:\Workshop\maven\MavenDemo03>mvn clean test

        显示结果如下:

            略

    7) 默认激活

        可以在声明 Profile 时,指定其默认激活。例如,在 id 为 default 的 Profile 中添加以下配置,指定该 Profile 默认激活。

复制代码

1             <profile>2                 <id>default</id>3                 <activation>4                     <activeByDefault>true</activeByDefault>5                 </activation>6                 ...7             8             </profile>

复制代码

        打开 cmd 命令行窗口,进入 D:\Workshop\maven\MavenDemo03 目录,执行如下命令:

            D:\Workshop\maven\MavenDemo03>mvn clean test

        显示结果如下:

            略

转自:https://www.cnblogs.com/tkuang/p/16362003.html