其他分享
首页 > 其他分享> > Maven基础知识(8)- Maven Profile

Maven基础知识(8)- Maven Profile

作者:互联网

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

        显示结果如下:

            略


标签:Profile,maven,基础知识,Maven,MavenDemo03,test,激活
来源: https://www.cnblogs.com/tkuang/p/16362003.html