Maven根据pom文件中的Profile标签动态配置编译选项
概述
在实际项目开发中,我们需要根据不同的使用场景,构建不同的程序包。当使用Maven编译时,我们可以通过Maven的profile标签来配置编译选项,从而达到生成不同构建产物的目的。例如,在开发环境下,我们有一套适用于本机的调试配置;而在生产环境下,又需要关闭调试环境时的大量调试日志,或变更日志保存路径等。这些需求都可以通过Maven的Profile标签配置来解决。
profile可以让我们定义一系列的配置信息,然后指定其激活条件。由此,我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。比如说,我们可以通过profile定义在jdk1.5以上使用一套配置信息,在jdk1.5以下使用另外一套配置信息;或者有时候我们可以通过操作系统的不同来使用不同的配置信息,比如windows下是一套信息,linux下又是另外一套信息,等等。
profile属性的定义位置
我们有多个可选位置来定义profile。定义的地方不同,它的作用范围也不同。
- 针对于特定项目的profile配置我们可以定义在该项目的pom.xml中。
- 针对于特定用户的profile配置,我们可以在用户的settings.xml文件中定义profile。该文件在用户家目录下的“.m2”目录下。
- 全局的profile配置。全局的profile是定义在Maven安装目录下的“conf/settings.xml”文件中的。
profile中能定义的信息
profile中能够定义的配置信息跟profile所处的位置是相关的。以下就分两种情况来讨论,一种是定义在settings.xml中,另一种是定义在pom.xml中。
profile定义在settings.xml中
当profile定义在settings.xml中时意味着该profile是全局的,它会对所有项目或者某一用户的所有项目都产生作用。也正因为它是全局的,所以在settings.xml中只能定义一些相对而言范围宽泛一点的配置信息,比如远程仓库等。而一些比较细致一点的需要根据项目的不同来定义的就需要定义在项目的pom.xml中。具体而言,能够定义在settings.xml中的信息有:
- <repositories>
- <pluginRepositories>
- <properties>
- 定义在<properties>里面的键值对可以在pom.xml中使用。
profile定义在pom.xml中
定义在pom.xml中的profile可以定义更多的信息。主要有以下这些:
- <repositories>
- <pluginRepositories>
- <dependencies>
- <plugins>
- <properties>
- <dependencyManagement>
- <distributionManagement>
还有build元素下面的子元素,主要包括:
- <defaultGoal>
- <resources>
- <testResources>
- <finalName>
profile标签配置的激活方式
Maven给我们提供了多种不同的profile激活方式。比如我们可以使用-P参数在编译时,显示的激活一个profile,也可以根据环境条件的设置让它自动激活等。
使用activeByDefault设置默认激活(定义在pom文件中)
<profiles>
<profile>
<id>dev</id>
<properties>
<properties.active>dev</properties.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>release</id>
<properties>
<properties.active>release</properties.active>
</properties>
</profile>
</profiles>
我们可以在profile下的activation标签中,通过activeByDefault标签配置激活状态,当没有在编译命令中配置任何激活条件时,activeByDefault标签在哪个profile下配置为true的时候,就表示该profile在编译时默认会被激活。
在settings.xml中使用activeProfiles指定处于激活状态的profile
我们可以在settings.xml中使用activeProfiles来指定需要激活的profile,这种方式激活的profile将所有情况下都处于激活状态。比如现在我们定义了如下两个profile:
<profiles>
<profile>
<id>dev</id>
<properties>
<properties.active>dev</properties.active>
</properties>
</profile>
<profile>
<id>release</id>
<properties>
<properties.active>release</properties.active>
</properties>
</profile>
</profiles>
这里的profile可以是定义在settings.xml中的,也可以是定义在pom.xml中的。当这时需要指定dev为激活状态,那么我们就可以在settings.xml中定义activeProfiles,如下:
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
考虑这样一种情况,我们在activeProfiles下同时定义了多个需要激活的profile。这里还拿上面的profile定义来举例,我们定义了同时激活dev和release。
<activeProfiles>
<activeProfile>dev</activeProfile>
<activeProfile>release</activeProfile>
</activeProfiles>
那么这个时候我在pom.xml中使用属性properties.active的时候,它是根据profile定义的先后顺序来进行覆盖取值的,即后面定义的会覆盖前面定义的。
使用-P参数显示的激活一个profile
我们在进行Maven操作时可以使用-P参数显示的指定当前激活的是哪一个profile。比如我们需要在对项目进行打包的时候使用id为dev的profile,我们就可以这样做:
mvn package -P dev
假如我们使用activeByDefault或settings.xml中定义了处于激活的profile,但是当我们在进行某些操作的时候又不想它处于激活状态,这个时候我们可以这样做:
mvn package –P !dev
这里假设dev是在settings.xml中使用activeProfile标记的处于激活状态的profile,那么当我们使用“-P !dev”的时候就表示在当前操作中该profile将不处于激活状态。
根据编译环境来激活profile
profile一个非常重要的特性就是它可以根据不同的编译环境来激活,比如说根据操作系统的不同激活不同的profile,也可以根据jdk版本的不同激活不同的profile,等等。
<profiles>
<profile>
<id>profileTest1</id>
<jdk>1.5</jdk>
</profile>
<profiles>
举例-基于Springboot下的log4j2实践配置步骤
我们以配置log4j2为例来说一说开发环境和生产环境的不同设置。
一、在src/main/resources/下新建config目录,并在其中创建dev和release文件夹

二、分别编写两个不同环境下的log4j2配置文件
这两个配置文件的主要区别在于,其中的日志保存路径是不同的。(此处只是为了演示区别,随意对路径进行了配置,可自己配置所需路径) 调试用的log4j2-spring.xml:


三、配置POM文件
在项目的pom.xml文件中,在其根节点project下,增加profiles标签:

其中:
- <profile>标签表明当前为一个profile描述体
- <id>标签表明当前profile的id,用来区分不同的profile
- <properties>标签中,可以自定义K、V值,这里的标签名任意,在项目的properties或xml等配置文件中可以使用${profiles.active}可以取出”dev”或“release”这个值
在项目的pom.xml文件中,在其build节点下,增加resource标签:

其中:
- <directory>表示编译所需的资源目录
- <excludes>标签表示排除掉资源目录下的某文件或文件夹
- <targetPath>表示该资源标签下的资源打包编译后的保存路径,“.”表示当前路径 由此可见,我们将路径src/main/resources/config/${profiles.active}配置上了我们在profile中定义的Key值,这样,当我们通过-P参数来激活配置时,就可以引入对应的配置文件了。
四、编译
通过执行下面的命令进行编译:
mvn package -P dev
激活了dev编译条件。编译生成war或jar文件后,可以解压构建包,确认配置文件被打包到构建包的根目录下。
总结
profile的配置是非常灵活的,通过在profile标签下自定义一些键值对,并在其他配置文件中使用这些键值,就可以在编译时指定激活的配置。本文举例了如何从文件的维度,来进行配置文件的配置。相对于单一的配置键值对的使用来说,实际上是列举了一个包含小技巧的例子,而这个小例子也是日常我们经常会遇到的。希望大家能够在实际运用中采用,有任何问题和错误之处,欢迎评论指正,不胜感激。
附录
附Maven-profiles说明链接: Maven – Introduction to build profiles
小铭出品,必属精品。
转载自:https://juejin.cn/post/6844903653782863879