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 idid> 4 .... 5 profile> 6 <profile> 7 <id>profile idid> 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) 一级元素
repositories
pluginRepositories
dependencies
plugins
dependencyManagement
distributionManagement
modules
properties
reporting
build
(2) 二级元素
plugins
defaultGoal
resources
testResources
directory
filters
finalName
pluginManagement
filters
3. 激活 Profile
Profile 能够在项目构建时,修改 POM 中配置或者添加一些额外的配置元素。用户可以通过多种方式激活 Profile,以实现不同环境使用不同的配置,执行不同的构建过程。
Profile 可以通过以下 6 种方式激活:
(1) 命令行激活
(2) settings.xml 文件显示激活
(3) 系统属性激活
(4) 操作系统环境激活
(5) 文件存在与否激活
(6) 默认激活
示例
本文在 “” 里 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.0modelVersion> 7 <groupId>com.examplegroupId> 8 <artifactId>MavenDemo03artifactId> 9 <version>1.0-SNAPSHOTversion> 10 <packaging>jarpackaging> 11 12 <dependencies> 13 <dependency> 14 <groupId>junitgroupId> 15 <artifactId>junitartifactId> 16 <version>3.8.1version> 17 <scope>compilescope> 18 dependency> 19 dependencies> 20 21 <profiles> 22 23 24 <profile> 25 <id>defaultid> 26 <build> 27 <plugins> 28 <plugin> 29 <groupId>org.apache.maven.pluginsgroupId> 30 <artifactId>maven-antrun-pluginartifactId> 31 <version>1.8version> 32 <executions> 33 <execution> 34 <phase>testphase> 35 <goals> 36 <goal>rungoal> 37 goals> 38 <configuration> 39 <tasks> 40 <echo>使用 env.properties,将其复制到 classpathecho> 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 52 <profile> 53 <id>testid> 54 <activation> 55 <property> 56 <name>envname> 57 <value>testvalue> 58 property> 59 activation> 60 <build> 61 <plugins> 62 <plugin> 63 <groupId>org.apache.maven.pluginsgroupId> 64 <artifactId>maven-antrun-pluginartifactId> 65 <version>1.8version> 66 <executions> 67 <execution> 68 <phase>testphase> 69 <goals> 70 <goal>rungoal> 71 goals> 72 <configuration> 73 <tasks> 74 <echo>使用 env.test.properties,将其复制到 classpathecho> 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>prodid> 88 <build> 89 <plugins> 90 <plugin> 91 <groupId>org.apache.maven.pluginsgroupId> 92 <artifactId>maven-antrun-pluginartifactId> 93 <version>1.8version> 94 <executions> 95 <execution> 96 <phase>testphase> 97 <goals> 98 <goal>rungoal> 99 goals> 100 <configuration> 101 <tasks> 102 <echo>使用 env.prod.properties,将其复制到 classpathecho> 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>testactiveProfile> 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>prodid> 4 <activation> 5 <property> 6 <name>username> 7 <value>prodvalue> 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>defaultp> 3 <activation> 4 <os> 5 <name>Windows 10name> 6 <family>Windowsfamily> 7 <arch>amd64arch> 8 <version>10.0version> 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>prodid> 3 <activation> 4 <file> 5 <exists>./src/main/resources/env.prod.propertiesexists> 6 <missing>./src/main/resources/env.test.propertiesmissing> 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>defaultid> 3 <activation> 4 <activeByDefault>trueactiveByDefault> 5 activation> 6 ... 7 8 profile>
打开 cmd 命令行窗口,进入 D:\Workshop\maven\MavenDemo03 目录,执行如下命令:
D:\Workshop\maven\MavenDemo03>mvn clean test
显示结果如下:
略