1. flatten-maven-plugin 介绍

1.1 环境

  • IntelliJ IDEA 2021.3
  • JDK 1.8.0_301
  • Apache Maven 3.8.1
  • org.codehaus.mojo:versions-maven-plugin 1.2.7
  • https://www.mojohaus.org/flatten-maven-plugin/

1.2 版本占位符

自 Maven 3.5.0-beta-1 开始,可以使用 ${revision}, ${sha1} and/or ${changelist} 这样的变量作为版本占位符。

  • 像这样:
<project><modelVersion>4.0.0</modelVersion><groupId>org.apache.maven.ci</groupId><artifactId>ci-parent</artifactId><name>First CI Friendly</name><version>${revision}</version><properties><revision>1.0</revision></properties>...
</project>
  • 或者像这样:
<project><modelVersion>4.0.0</modelVersion><groupId>org.apache.maven.ci</groupId><artifactId>ci-parent</artifactId><name>First CI Friendly</name><version>${revision}${sha1}${changelist}</version>...<properties><revision>1.0</revision><changelist>-SNAPSHOT</changelist><sha1/></properties>
</project>
  • 可以使用这样的命令:
mvn -Drevision=2.7.8 -Dchangelist=-RELEASE -Dsha1=ssbd clean package
  • 缺点:

Install / Deploy 时,版本占位符将不能被替换。这将导致 Install / Deploy 后, maven 不能识别。

使用 flatten-maven-plugin 解决这个问题。

  • flatten-maven-plugin:
<build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>flatten-maven-plugin</artifactId><version>${flatten-maven-plugin.version}</version><configuration><updatePomFile>true</updatePomFile><flattenMode>resolveCiFriendliesOnly</flattenMode></configuration><executions><execution><id>flatten</id><phase>process-resources</phase><goals><goal>flatten</goal></goals></execution><execution><id>flatten-clean</id><phase>clean</phase><goals><goal>clean</goal></goals></execution></executions></plugin></plugins>
</build>

2. 实例分析

2.1 先看一下自己构建的项目

基于 COLA 4.X 构建一个项目,本人目前正在写支付中台,所以就以此为例构建 “pointer-pay” 项目:

mvn archetype:generate \-DgroupId=com.pointer.pay \-DartifactId=pointer-pay \-Dversion=1.0.0-SNAPSHOT \-Dpackage=com.pointer.pay \-DarchetypeArtifactId=cola-framework-archetype-web \-DarchetypeGroupId=com.alibaba.cola \-DarchetypeVersion=4.3.1

然后看一下其初始项目的版本管理方式:

parent:

module:

  • 可以看到这里的父工程和modules都写死了版本。当然,像支付中台或者其他不会变更需求的项目,这个写也没什么毛病。

  • But,在大多数互联网公司中,几乎每个项目都处在版本快速迭代中,甚至一两周更新一个小版本,一个月更新一个大版本。如果还是这样直接写死版本的话,通常做法就是全局搜索替换版本号,这样就显得很捞,也不太科学。然后就有了
    revision 的占位符统一管理。

2.2 再看一下开源项目是怎么进行版本管理的

我们可以在 spring-boot 和 spring-cloud-alibaba 的开源项目中看到,其就是利用 revision 占位符来进行统一版本管理的。

https://github.com/spring-projects/spring-boot/blob/2.2.x/pom.xml

https://github.com/alibaba/spring-cloud-alibaba/blob/2021.x/pom.xml

2.3 改造 pointer-pay

  1. 先看一下原来的项目结构:
  2. 然后利用 revision 占位符来统一管理版本:

父工程pom:

子工程pom:

修改完以后编译运行都没问题。然后 install、deploy 的时候就出现问题了:打出来的jar包的pom文件里还是原来的revision变量,下面一起到maven仓库中查看一下:

可见这里识别不出版本号,也就会导致引用方不能识别你的 pom/jar 包。这时 flatten-maven-plugin 就该出场了,在你的父 pom 引入相关插件:

<build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>flatten-maven-plugin</artifactId><version>1.2.7</version><configuration><updatePomFile>true</updatePomFile><flattenMode>resolveCiFriendliesOnly</flattenMode></configuration><executions><execution><id>flatten</id><phase>process-resources</phase><goals><goal>flatten</goal></goals></execution><execution><id>flatten-clean</id><phase>clean</phase><goals><goal>clean</goal></goals></execution></executions></plugin></plugins>
</build>

然后重新 clean、install 一下,你会发现每个模块根目录下多了一个 .flattened-pom.xml 文件,那么这个玩意是怎么生成的呢?下面一起看一下 updatePomFile 标签,官方文档是这个描述的:

The flag to indicate if the generated flattened POM shall be set as POM file to the current project. By default this is only done for projects with packaging other than pom. You may want to also do this for pom packages projects by setting this parameter to true or you can use false in order to only generate the flattened POM but never set it as POM file. If flattenMode is set to bom the default value will be true.

大概意思是:updatePomFile 属性表示是否将生成的 .flattened-pom.xml 作为当前项目的 pom 文件。默认只有打包的时候(package、install、deploy)会将 .flattened-pom.xml 做为当前项目的 pom 文件,但是打包类型 pom 的 pom.xml 中的占位符是不会被替换的。如果想要都被替换,那就将 updatePomFile 的属性设置为 true 吧。如果 flattenMode 被设置为 bom,updatePomFile 默认属性值为 true。

再一起看一下引入 flatten-maven-plugin 之后编译过的 pom 文件:

【SpringBoot】Maven 版本管理与 flatten-maven-plugin 插件的使用及分析相关推荐

  1. Maven版本管理-Maven Release Plugin插件

    一.什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基 ...

  2. Maven 的 Maven Compiler Plugin 插件

    当前 Maven Compiler Plugin 这个插件的版本为 3.10.1 你可以使用最新的版本. 我们今天主要说一下这个插件中 --release 参数 这个插件的配置方法如下: <?x ...

  3. 关于maven的plugin插件问题(踩坑)

    关于maven的plugin插件问题(踩坑) 今天几乎花了一整天的时间来弄插件的问题 特此来复盘一下,没想到不起眼的plugin竟然困扰了我一天 文章目录 关于maven的plugin插件问题(踩坑) ...

  4. eclipse maven plugin 插件 安装 和 配置

    本文转自:http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html maven3 安装: 安装 ...

  5. java plugin 安装_eclipse maven plugin 插件 安装 和 配置

    Posted on 2012-07-13 12:40 fancydeepin 阅读(96246) 评论(45)  编辑  收藏  所属分类: Maven3 Guide 环境准备: eclipse(He ...

  6. eclipse maven plugin 插件安装和配置

    2019独角兽企业重金招聘Python工程师标准>>> 环境准备: eclipse(Helios) 3.6 maven 3.0.4 maven3 安装: 安装 Maven 之前要求先 ...

  7. SpringBoot 的其他使用 及 maven打包

    SpringBoot----开发环境/测试环境和生产环境 application.properties是SpringBoot默认加载的,全局配置,则全部放在这里,假如有需要不同环境,配置不同的参数,比 ...

  8. 使用liquibase进行数据库迁移(Postgresql/Mysql)——springboot整合Liquibase以及使用maven命令执行Liquibase同步更新数据

    文章目录 一.什么是Liquibase? 1.liquibase的优点 2.liquibase的基本概念 3.官网地址 二.SpringBoot整合Liquibase 1.简介 2.项目结构 3.测试 ...

  9. maven 版本管理

    什么是版本管理 首先,这里说的版本管理(version management)不是指版本控制(version control),但是本文假设你拥有基本的版本控制的知识,了解subversion的基本用 ...

最新文章

  1. 多线程大文件断点续传和流媒体的处理方法
  2. java 与c 运行效率_Java语言与C语言代码运行效率的比较
  3. mysql load data into_MySQL 之 LOAD DATA INFILE 快速导入数据
  4. RabbitMQ—队列迁移插件shovel的使用
  5. python3远程连接_Python3 SSH远程连接服务器的方法示例
  6. python if else 必须同时出现吗,Python:Inline if语句else什么也不做
  7. 抠像噪点去除 unity_这个在线抠图工具,好用又免费,告别Photoshop繁杂操作
  8. matlab getsplitpic,MATLAB_9-模式识别笔记
  9. 简述什么是SQL注入,写出简单的SQL注入语句。
  10. 泛函分析 04.02 有界线性算子 - 有界线性算子空间的收敛与完备性
  11. delphi计算机语言排名,2020年3月TIOBE编程语言排行榜 Java继续蝉联榜首
  12. zabbix报警 Lack of free swap space on zabbix
  13. 乐动手环app下载安装_乐动健康手环app下载-乐动健康客户端v2.34 安卓最新版 - 极光下载站...
  14. 基于SSM实现的艺术品鉴定管理系统+App
  15. 太原市山大附中2021年高考成绩查询,太原高中排名及分数线,2021太原市高中排名榜最新...
  16. 微服务拆分原则之 AKF
  17. 计算机视觉 (CV) 相关的会议或期刊投稿时间
  18. 【刷题笔记】--lintcode木头加工(java)
  19. gps和惯性组合matlab程序,北航卡尔曼滤波与组合导航 第三次作业 SINS/GPS组合动态实验...
  20. [DirectX12学习笔记] 环境光遮蔽

热门文章

  1. Redis的主从同步 - 邱乘屹的个人技术博客
  2. C1认证:修改《植物大战僵尸》的文件
  3. 第一课:了解和认识51单片机
  4. 搜狗搜索日志分析系统500w数据(实现数据分析需求一至五)
  5. 为什么微博签到数据如此受欢迎?
  6. 四轮独立驱动原地掉头,滑轮差速法具体算法模型
  7. python xlwt写excel格式控制 颜色、模式、编码、背景色
  8. 微信小程序回到顶部的两种方式
  9. 流体力学2——微分形式的基本方程
  10. 气象类软件如何测试方法,“能见度”如何测准?这个神器,90%的气象人不知道!...