我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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.0modelVersion>  <groupId>org.apache.maven.cigroupId>  <artifactId>ci-parentartifactId>  <name>First CI Friendlyname>  <version>${revision}version>  <properties><revision>1.0revision>  properties>  ...project>
  • 或者像这样:
<project>  <modelVersion>4.0.0modelVersion>  <groupId>org.apache.maven.cigroupId>  <artifactId>ci-parentartifactId>  <name>First CI Friendlyname>  <version>${revision}${sha1}${changelist}version>  ...  <properties>    <revision>1.0revision>    <changelist>-SNAPSHOTchangelist>    <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.mojogroupId>            <artifactId>flatten-maven-pluginartifactId>            <version>${flatten-maven-plugin.version}version>            <configuration>                <updatePomFile>trueupdatePomFile>                <flattenMode>resolveCiFriendliesOnlyflattenMode>            configuration>            <executions>                <execution>                    <id>flattenid>                    <phase>process-resourcesphase>                    <goals>                        <goal>flattengoal>                    goals>                execution>                <execution>                    <id>flatten-cleanid>                    <phase>cleanphase>                    <goals>                        <goal>cleangoal>                    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.mojogroupId>            <artifactId>flatten-maven-pluginartifactId>            <version>1.2.7version>            <configuration>                <updatePomFile>trueupdatePomFile>                <flattenMode>resolveCiFriendliesOnlyflattenMode>            configuration>            <executions>                <execution>                    <id>flattenid>                    <phase>process-resourcesphase>                    <goals>                        <goal>flattengoal>                    goals>                execution>                <execution>                    <id>flatten-cleanid>                    <phase>cleanphase>                    <goals>                        <goal>cleangoal>                    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 文件:
在这里插入图片描述

来源地址:https://blog.csdn.net/weixin_42201180/article/details/127204351

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Springboot如何使用maven release插件执行版本管理及打包操作

这篇文章主要为大家展示了“Springboot如何使用maven release插件执行版本管理及打包操作”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Springboot如何使用maven r
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录