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

这篇具有很好参考价值的文章主要介绍了【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.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:
.flattened-pom.xml,微服务,Spring Boot,spring boot,maven,java

module:
.flattened-pom.xml,微服务,Spring Boot,spring boot,maven,java

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

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

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

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

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

.flattened-pom.xml,微服务,Spring Boot,spring boot,maven,java

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

.flattened-pom.xml,微服务,Spring Boot,spring boot,maven,java

2.3 改造 pointer-pay

  1. 先看一下原来的项目结构:
    .flattened-pom.xml,微服务,Spring Boot,spring boot,maven,java
  2. 然后利用 revision 占位符来统一管理版本:

父工程pom:
.flattened-pom.xml,微服务,Spring Boot,spring boot,maven,java

子工程pom:
.flattened-pom.xml,微服务,Spring Boot,spring boot,maven,java

修改完以后编译运行都没问题。然后 install、deploy 的时候就出现问题了:打出来的jar包的pom文件里还是原来的revision变量,下面一起到maven仓库中查看一下:
.flattened-pom.xml,微服务,Spring Boot,spring boot,maven,java
可见这里识别不出版本号,也就会导致引用方不能识别你的 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 文件:
.flattened-pom.xml,微服务,Spring Boot,spring boot,maven,java文章来源地址https://www.toymoban.com/news/detail-659545.html

到了这里,关于【SpringBoot】Maven 版本管理与 flatten-maven-plugin 插件的使用及分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【springboot-maven项目,java: 错误: 不支持发行版本】

    【springboot-maven项目,java: 错误: 不支持发行版本】

    运行时报如下错误的信息: 图1:pom.xml里面的jdk与图2:框架设置的引用jdk不一致导致。 (创建springboot项目时,选用的jdk版本为21,而后续不小心修改了框架的jdk版本为11) 图1 图2:File Project Structure Modules 因为创建此项目时原因使用的是jdk21,所以将图二的jdk11改为jdk21,使其一

    2024年02月03日
    浏览(13)
  • idea新建Springboot项目,设置默认maven和jdk版本

    idea新建Springboot项目,设置默认maven和jdk版本

    问题: 由于每次新建Springboot项目,maven总是在c盘和jdk版本不是自己需要的版本。每次都需要自己重新配置。 解决: 为了解决这个问题,设置新建项目时指定默认配置。 一、设置新建项目时,默认指定的Maven版本 1.file–》Other Settings–》settinf for… 2.找到Maven配置。配置上即

    2024年02月16日
    浏览(83)
  • SpringBoot版本与Spring、java、maven、gradle版本对应汇总(1->3版本,收藏一波)

    SpringBoot版本与Spring、java、maven、gradle版本对应汇总(1->3版本,收藏一波)

    Spring Boot 3.1.x Spring Boot 3.0.x Spring Boot 2.7.x Spring Boot 2.6.x Spring Boot 2.5.x Spring Boot 2.4.x Spring Boot 2.3.x Spring Boot 2.2.x Spring Boot 2.1.x Spring Boot 2.0.x Spring Boot 1.5.x   Spring Boot 1.4.x  Spring Boot 1.3.x   Spring Boot 1.2.x  

    2024年02月03日
    浏览(10)
  • [springboot] spring-boot-maven-plugin指定版本问题

    1. pom.xml文件报如下错误: (需要指定版本) Plugin \\\'org.springframework.boot:spring-boot-maven-plugin:\\\' not found 解决方法: 打开Maven本地仓库。查看/org/springframework/boot路径下的spring-boot-maven-plugin文件夹底下,是否存在与springboot的版本相对应版本号,如果存在,添加version标签为自己的sp

    2024年02月13日
    浏览(49)
  • spring-Bean管理-springboot原理-Maven高级

    spring-Bean管理-springboot原理-Maven高级

    优先级(低→高) application.yaml(忽略) application.yml application.properties java系统属性(-Dxxx=xxx) 命令行参数(–xxx=xxx) 1.获取bean 上述所说的【Spring项目启动时,会把其中的bean都创建好】还会受到作用域及延迟初始化影响,这里主要针对于默认的单例非延迟加载的bean而言。 2.bean作用

    2024年02月06日
    浏览(10)
  • JavaWeb开发06-原理-Spring配置优先级-Bean管理-SpringBoot原理-Maven继承和聚合-私服

    JavaWeb开发06-原理-Spring配置优先级-Bean管理-SpringBoot原理-Maven继承和聚合-私服

    不同配置文件,配置同一个属性谁有效 propertiesymlyaml 命令行参数Java系统属性 项目打包后要改变属性: 红色是Java系统属性,绿色是命令行参数 ‘ 获取IOC容器:applicationContext就是IOC容器对象 IOC容器中bean是默认单例的只有一个,这样三个获取的bean是同一个 单例还是多例取决

    2024年04月23日
    浏览(13)
  • 基于Springboot+MYSQL+Maven实现的宠物医院管理系统(源码+数据库+运行指导文档+项目运行指导视频)

    基于Springboot+MYSQL+Maven实现的宠物医院管理系统(源码+数据库+运行指导文档+项目运行指导视频)

    本项目是一套基于springboot框架实现的宠物医院管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值 j

    2024年02月05日
    浏览(11)
  • Springboot 订餐管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

    Springboot 订餐管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

    一、源码特点   springboot 订餐管理系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有 完整的源代码和数据库,系统主要采用B/S模式开发。 前段主要技术 bootstrap.css jquery 后端主

    2024年02月07日
    浏览(9)
  • Maven 3-Maven依赖版本冲突的分析及解决小结

    Maven 3-Maven依赖版本冲突的分析及解决小结

    举例 A依赖于B及C,而B又依赖于X、Y,而C依赖于X、M,则A除引B及C的依赖包下,还会引入X,Y,M的依赖包(一般情况下了,Maven可通过scope等若干种方式控制传递依赖)。 这里有一个需要特别注意的,即B和C同时依赖于X,假设B依赖于X的1.0版本,而C依赖于X的2.0版本,A究竟依赖

    2024年02月03日
    浏览(12)
  • Maven第八章:如何解决Maven的jar版本冲突

    前言 本文重点讲解Maven依赖冲突原因,maven依赖原则以及如何利用idea Maven Helper插件分析解决问题。 背景 开发过程中引入第三方jar遇到依赖冲突的,非常影响开发,甚至大部分时间都在调试版本兼容。

    2024年02月06日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包