当前位置: 首页 > news >正文

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:

正式环境下的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

小铭出品,必属精品。

相关文章:

  • openlayers+geoserver+wms实现空间查询,属性查询
  • 关于 HandlerMethodArgumentResolver 类 以及 WebArgumentResolver 类 自定义解析参数
  • vue.js有什么用,是用来做什么的(整理)
  • Redis字符串类型内部编码剖析
  • HAPkendoUI的Excle导出
  • js 和 css动画
  • [IOI2007 D1T1]Miners 矿工配餐
  • 10.监视SQL Server性能
  • QEMU增量镜像制作
  • SpringBoot 核心模块原理剖析
  • Confluence 6 的小型文字档案(Cookies)
  • WPF中使用amCharts绘制股票K线图
  • 装饰者模式--穿什么有这么重要?
  • 健身:手臂训练
  • SQLServer------查询结果为空的列赋默认值
  • __proto__ 和 prototype的关系
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • MySQL用户中的%到底包不包括localhost?
  • Spring Cloud Feign的两种使用姿势
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 今年的LC3大会没了?
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ###STL(标准模板库)
  • #stm32整理(一)flash读写
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (1)(1.9) MSP (version 4.2)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (办公)springboot配置aop处理请求.
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)appium-desktop定位元素原理
  • (一)基于IDEA的JAVA基础1
  • **PHP二维数组遍历时同时赋值
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET gRPC 和RESTful简单对比
  • @Autowired注解的实现原理
  • @SpringBootApplication 包含的三个注解及其含义
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • []指针
  • [Android]如何调试Native memory crash issue
  • [Angular 基础] - 表单:响应式表单
  • [ES-5.6.12] x-pack ssl
  • [Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器
  • [Java]快速入门优先队列(堆)手撕相关面试题
  • [Linux]进程创建➕进程终止
  • [Python] 字典操作及方法总结
  • [SageMath] 关于SageMath本地环境的搭建与基本使用
  • [SWPUCTF 2021 新生赛]easy_md5