在实际项目开发中,咱们须要根据不一样的使用场景,构建不一样的程序包。当使用Maven编译时,咱们能够经过Maven的profile标签来配置编译选项,从而达到生成不一样构建产物的目的。例如,在开发环境下,咱们有一套适用于本机的调试配置;而在生产环境下,又须要关闭调试环境时的大量调试日志,或变动日志保存路径等。这些需求均可以经过Maven的Profile标签配置来解决。html
profile可让咱们定义一系列的配置信息,而后指定其激活条件。由此,咱们就能够定义多个profile,而后每一个profile对应不一样的激活条件和配置信息,从而达到不一样环境使用不一样配置信息的效果。好比说,咱们能够经过profile定义在jdk1.5以上使用一套配置信息,在jdk1.5如下使用另一套配置信息;或者有时候咱们能够经过操做系统的不一样来使用不一样的配置信息,好比windows下是一套信息,linux下又是另一套信息,等等。linux
咱们有多个可选位置来定义profile。定义的地方不一样,它的做用范围也不一样。spring
profile中可以定义的配置信息跟profile所处的位置是相关的。如下就分两种状况来讨论,一种是定义在settings.xml中,另外一种是定义在pom.xml中。apache
当profile定义在settings.xml中时意味着该profile是全局的,它会对全部项目或者某一用户的全部项目都产生做用。也正由于它是全局的,因此在settings.xml中只能定义一些相对而言范围宽泛一点的配置信息,好比远程仓库等。而一些比较细致一点的须要根据项目的不一样来定义的就须要定义在项目的pom.xml中。具体而言,可以定义在settings.xml中的信息有:windows
定义在pom.xml中的profile能够定义更多的信息。主要有如下这些:bash
还有build元素下面的子元素,主要包括:maven
Maven给咱们提供了多种不一样的profile激活方式。好比咱们可使用-P参数在编译时,显示的激活一个profile,也能够根据环境条件的设置让它自动激活等。ide
<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在编译时默认会被激活。ui
咱们能够在settings.xml中使用activeProfiles来指定须要激活的profile,这种方式激活的profile将全部状况下都处于激活状态。好比如今咱们定义了以下两个profile:spa
<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:
在项目的pom.xml文件中,在其根节点project下,增长profiles标签:
其中:
在项目的pom.xml文件中,在其build节点下,增长resource标签:
其中:
经过执行下面的命令进行编译:
mvn package -P dev
复制代码
激活了dev编译条件。编译生成war或jar文件后,能够解压构建包,确认配置文件被打包到构建包的根目录下。
profile的配置是很是灵活的,经过在profile标签下自定义一些键值对,并在其余配置文件中使用这些键值,就能够在编译时指定激活的配置。本文举例了如何从文件的维度,来进行配置文件的配置。相对于单一的配置键值对的使用来讲,其实是列举了一个包含小技巧的例子,而这个小例子也是平常咱们常常会遇到的。但愿你们可以在实际运用中采用,有任何问题和错误之处,欢迎评论指正,不胜感激。
附Maven-profiles说明连接: Maven – Introduction to build profiles
小铭出品,必属精品。