在正式介绍之前,我们先看看 pom.xml 文件中 profiles 部分的配置。如下:
<profiles>
<!-- 开发环境 -->
<profile>
<!-- 不同环境Profile的唯一id -->
<id>dev</id>
<properties>
<!-- profiles.active是自定义的字段,自定义字段可以有多个 -->
<profiles.active>dev</profiles.active>
</properties>
<activation>
<!-- 标记为默认 profile -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 生成环境 -->
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<profiles.active>test</profiles.active>
</properties>
</profile>
</profiles>上面定义了3个profile,id分别为dev(开发环境)、prod(生成环境)、test(测试环境)。profile的激活方式有很多种。
使用 “mvn --help”命令查看帮助信息,找到 -P 的帮助信息,如下:
-P,--activate-profiles <arg> Comma-delimited list of profiles to activate(使用逗号分隔要激活的profile)
实例:使用 “mvn -P prod clean package” 命令激活 id 等于 prod 的 profile,在该 profile 上面执行 clean 和 package 生命周期。如下:
D:\learn\Maven\workspaces\learn-maven-profile4>mvn -P prod clean package
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------< com.huangx.maven:learn-maven-profile4 >----------------
[INFO] Building learn-maven-profile4 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ learn-maven-profile4 ---
[INFO] Deleting D:\learn\Maven\workspaces\learn-maven-profile4\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ learn-maven-profile4 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 2 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ learn-maven-profile4 ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[INFO] Compiling 3 source files to D:\learn\Maven\workspaces\learn-maven-profile4\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ learn-maven-profile4 ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\learn\Maven\workspaces\learn-maven-profile4\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ learn-maven-profile4 ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ learn-maven-profile4 ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ learn-maven-profile4 ---
[INFO] Building jar: D:\learn\Maven\workspaces\learn-maven-profile4\target\learn-maven-profile4-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.746 s
[INFO] Finished at: 2019-08-08T08:27:47+08:00
[INFO] ------------------------------------------------------------------------activation 也存在多种方式,分别如下:
(1)activeByDefault(默认激活某个profile)
<profile>
<!-- 不同环境Profile的唯一id -->
<id>dev</id>
<properties>
<!-- profiles.active是自定义的字段,自定义字段可以有多个 -->
<profiles.active>dev</profiles.active>
</properties>
<activation>
<!-- 标记为默认 profile -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>上面定义的 dev profile 将会被默认激活,这一般可以用来指定开发环境。
(2)jdk版本
jdk版本可以根据不同的jdk版本来激活不同的 profile,其中
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
<!-- 根据jdk环境来激活 -->
<activation>
<!-- 通过jdk版本 -->
<!-- 当jdk环境版本为1.5时,此profile被激活 -->
<jdk>1.5</jdk>
<!-- 当jdk环境版本1.5或以上时,此profile被激活 -->
<jdk>[1.5,)</jdk>
</activation>
</profile>上面,定义 id 为 prod 的 profile 在 jdk 版本为 1.5 或 1.5+ 上时被激活。
(3)操作系统
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
<activation>
<!--根据当前操作系统-->
<os>
<name>Windows 8.1</name>
<family>Windows</family>
<arch>amd64</arch>
<version>6.3</version>
</os>
</activation>
</profile>使用操作系统激活指定的profile,你可能不知道os.name、os.arch 和 os.version 该怎么填写,其实很简单,直接写一个简单的 java 程序,获取系统的操作系统信息即可。代码如下:
package com.huangx.maven;
public class SystemInfo {
public static void main(String[] args) {
// os.name 操作系统的名称
System.out.println( System.getProperty("os.name") );
// os.arch 操作系统的架构
System.out.println( System.getProperty("os.arch") );
// os.version 操作系统的版本
System.out.println( System.getProperty("os.version") );
}
}(4)系统环境变量(需要使用 -D 而不是使用 -P 来定义系统环境变量)
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
<activation>
<!--通过系统环境变量,name-value自定义 -->
<property>
<name>env</name>
<value>prod</value>
</property>
</activation>
</profile>注意,我们需要执行“mvn -D env=prod clean package”命令来激活该 profile。
(5)文件的存在或缺失
<profile>
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
</properties>
<activation>
<!-- 通过文件的存在或缺失 -->
<file>
<!-- 文件不存在激活 -->
<missing>target/classes/not-file.txt</missing>
<!-- 文件存在激活 -->
<exists/>
</file>
</activation>
</profile>实际项目可以根据需要选取一种即可。这种的优先级低于maven命令参数指定的方式。