Maven根据pom文件中的Profile标签动态配置编译选项

概述

  在实际项目开发中,咱们须要根据不一样的使用场景,构建不一样的程序包。当使用Maven编译时,咱们能够经过Maven的profile标签来配置编译选项,从而达到生成不一样构建产物的目的。例如,在开发环境下,咱们有一套适用于本机的调试配置;而在生产环境下,又须要关闭调试环境时的大量调试日志,或变动日志保存路径等。这些需求均可以经过Maven的Profile标签配置来解决。html

  profile可让咱们定义一系列的配置信息,而后指定其激活条件。由此,咱们就能够定义多个profile,而后每一个profile对应不一样的激活条件和配置信息,从而达到不一样环境使用不一样配置信息的效果。好比说,咱们能够经过profile定义在jdk1.5以上使用一套配置信息,在jdk1.5如下使用另一套配置信息;或者有时候咱们能够经过操做系统的不一样来使用不一样的配置信息,好比windows下是一套信息,linux下又是另一套信息,等等。linux

profile属性的定义位置

  咱们有多个可选位置来定义profile。定义的地方不一样,它的做用范围也不一样。spring

  • 针对于特定项目的profile配置咱们能够定义在该项目的pom.xml中。
  • 针对于特定用户的profile配置,咱们能够在用户的settings.xml文件中定义profile。该文件在用户家目录下的“.m2”目录下。
  • 全局的profile配置。全局的profile是定义在Maven安装目录下的“conf/settings.xml”文件中的。

profile中能定义的信息

  profile中可以定义的配置信息跟profile所处的位置是相关的。如下就分两种状况来讨论,一种是定义在settings.xml中,另外一种是定义在pom.xml中。apache

profile定义在settings.xml中

  当profile定义在settings.xml中时意味着该profile是全局的,它会对全部项目或者某一用户的全部项目都产生做用。也正由于它是全局的,因此在settings.xml中只能定义一些相对而言范围宽泛一点的配置信息,好比远程仓库等。而一些比较细致一点的须要根据项目的不一样来定义的就须要定义在项目的pom.xml中。具体而言,可以定义在settings.xml中的信息有:windows

  • <repositories>
  • <pluginRepositories>
  • <properties>
  • 定义在<properties>里面的键值对能够在pom.xml中使用。

profile定义在pom.xml中

定义在pom.xml中的profile能够定义更多的信息。主要有如下这些:bash

  • <repositories>
  • <pluginRepositories>
  • <dependencies>
  • <plugins>
  • <properties>
  • <dependencyManagement>
  • <distributionManagement>

还有build元素下面的子元素,主要包括:maven

  • <defaultGoal>
  • <resources>
  • <testResources>
  • <finalName>

profile标签配置的激活方式

  Maven给咱们提供了多种不一样的profile激活方式。好比咱们可使用-P参数在编译时,显示的激活一个profile,也能够根据环境条件的设置让它自动激活等。ide

使用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在编译时默认会被激活ui

在settings.xml中使用activeProfiles指定处于激活状态的profile

  咱们能够在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定义的前后顺序来进行覆盖取值的,即后面定义的会覆盖前面定义的。

使用-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为例来讲一说开发环境和生产环境的不一样设置。

1、在src/main/resources/下新建config目录,并在其中建立dev和release文件夹

2、分别编写两个不一样环境下的log4j2配置文件

这两个配置文件的主要区别在于,其中的日志保存路径是不一样的。(此处只是为了演示区别,随意对路径进行了配置,可本身配置所需路径) 调试用的log4j2-spring.xml:

正式环境下的log4j2-spring.xml:

并分别将刚才的两个文件放置到对应的目录中。

3、配置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参数来激活配置时,就能够引入对应的配置文件了。

4、编译

经过执行下面的命令进行编译:

mvn package -P dev
复制代码

激活了dev编译条件。编译生成war或jar文件后,能够解压构建包,确认配置文件被打包到构建包的根目录下。

总结

profile的配置是很是灵活的,经过在profile标签下自定义一些键值对,并在其余配置文件中使用这些键值,就能够在编译时指定激活的配置。本文举例了如何从文件的维度,来进行配置文件的配置。相对于单一的配置键值对的使用来讲,其实是列举了一个包含小技巧的例子,而这个小例子也是平常咱们常常会遇到的。但愿你们可以在实际运用中采用,有任何问题和错误之处,欢迎评论指正,不胜感激。

附录

附Maven-profiles说明连接: Maven – Introduction to build profiles

小铭出品,必属精品。

相关文章
相关标签/搜索