在实际项目开发中,我们需要根据不同的使用场景,构建不同的程序包。当使用Maven编译时,我们可以通过Maven的profile标签来配置编译选项,从而达到生成不同构建产物的目的。例如,在开发环境下,我们有一套适用于本机的调试配置;而在生产环境下,又需要关闭调试环境时的大量调试日志,或变更日志保存路径等。这些需求都可以通过Maven的Profile标签配置来解决。
profile可以让我们定义一系列的配置信息,然后指定其激活条件。由此,我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。比如说,我们可以通过profile定义在jdk1.5以上使用一套配置信息,在jdk1.5以下使用另外一套配置信息;或者有时候我们可以通过操作系统的不同来使用不同的配置信息,比如windows下是一套信息,linux下又是另外一套信息,等等。
我们有多个可选位置来定义profile。定义的地方不同,它的作用范围也不同。
profile中能够定义的配置信息跟profile所处的位置是相关的。以下就分两种情况来讨论,一种是定义在settings.xml中,另一种是定义在pom.xml中。
当profile定义在settings.xml中时意味着该profile是全局的,它会对所有项目或者某一用户的所有项目都产生作用。也正因为它是全局的,所以在settings.xml中只能定义一些相对而言范围宽泛一点的配置信息,比如远程仓库等。而一些比较细致一点的需要根据项目的不同来定义的就需要定义在项目的pom.xml中。具体而言,能够定义在settings.xml中的信息有:
定义在pom.xml中的profile可以定义更多的信息。主要有以下这些:
还有build元素下面的子元素,主要包括:
Maven给我们提供了多种不同的profile激活方式。比如我们可以使用-P参数在编译时,显示的激活一个profile,也可以根据环境条件的设置让它自动激活等。
<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,这种方式激活的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定义的先后顺序来进行覆盖取值的,即后面定义的会覆盖前面定义的。
我们在进行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,也可以根据jdk版本的不同激活不同的profile,等等。
<profiles> <profile> <id>profileTest1</id> <jdk>1.5</jdk> </profile> <profiles> 复制代码
我们以配置log4j2为例来说一说开发环境和生产环境的不同设置。
这两个配置文件的主要区别在于,其中的日志保存路径是不同的。(此处只是为了演示区别,随意对路径进行了配置,可自己配置所需路径) 调试用的log4j2-spring.xml:
正式环境下的log4j2-spring.xml:
并分别将刚才的两个文件放置到对应的目录中。
在项目的pom.xml文件中,在其根节点project下,增加profiles标签:
其中:
在项目的pom.xml文件中,在其build节点下,增加resource标签:
其中:
通过执行下面的命令进行编译:
mvn package -P dev 复制代码
激活了dev编译条件。编译生成war或jar文件后,可以解压构建包,确认配置文件被打包到构建包的根目录下。
profile的配置是非常灵活的,通过在profile标签下自定义一些键值对,并在其他配置文件中使用这些键值,就可以在编译时指定激活的配置。本文举例了如何从文件的维度,来进行配置文件的配置。相对于单一的配置键值对的使用来说,实际上是列举了一个包含小技巧的例子,而这个小例子也是日常我们经常会遇到的。希望大家能够在实际运用中采用,有任何问题和错误之处,欢迎评论指正,不胜感激。