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

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

1. flatten-maven-plugin 介绍

1.1 环境

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 文件:

相关文章
|
10天前
|
Java Maven Spring
SpringBoot 系列之 Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
这篇文章描述了在使用Maven构建Spring Boot项目时遇到的`maven-resources-plugin`插件版本问题导致的编译失败,并提供了通过修改插件版本至3.1.0来解决这个问题的方法。
SpringBoot 系列之 Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resource
|
1天前
|
Java 测试技术 Maven
|
5天前
|
Java 测试技术 Maven
Maven 插件
Maven插件是Maven的核心组件,用于实现Maven生命周期各个阶段的任务。Maven定义了三个标准生命周期:clean(清理)、default(构建)和site(生成站点文档)。每个生命周期包括多个阶段,这些阶段由不同的Maven插件实现,例如maven-clean-plugin负责执行clean阶段的清理任务。用户可以通过命令行调用特定插件的目标来执行相应的任务,如构建JAR/WAR文件、编译代码、运行单元测试等。
|
7天前
|
Java 测试技术 Maven
Maven 插件
Maven插件是Maven的核心组件,用于实现Maven生命周期各个阶段的任务。Maven定义了三个标准生命周期:clean(清理)、default(构建)和site(生成站点文档)。每个生命周期包括多个阶段,这些阶段由不同的Maven插件实现,例如maven-clean-plugin负责执行clean阶段的清理任务。用户可以通过命令行调用特定插件的目标来执行相应的任务,如构建JAR/WAR文件、编译代码、运行单元测试等。
|
10天前
|
Java 测试技术 Maven
Maven 插件
Maven通过三大生命周期:clean(清理)、default(构建)、site(站点),管理项目构建过程。每个生命周期含多个阶段,由Maven插件实现具体功能。例如,`mvn clean`调用clean生命周期的clean阶段,实际操作由maven-clean-plugin完成。Maven插件负责诸如创建JAR/WAR文件、编译代码、单元测试、文档生成等任务,可通过`mvn [plugin-name]:[goal-name]`语法执行特定目标。
|
11天前
|
Java 测试技术 Maven
Maven 插件
Maven 通过三大生命周期管理构建过程:clean 清理项目,default (或 build) 处理构建部署,site 创建项目文档。每个阶段由插件实现,例如 `mvn clean` 调用 maven-clean-plugin 清理项目。Maven 本质上是一个依赖插件执行的框架,插件用于编译代码、创建 JAR/WAR 文件、运行单元测试及生成文档等任务,并可通过 `mvn [plugin-name]:[goal-name]` 格式调用。
|
2天前
|
Java jenkins 持续交付
jenkins学习笔记之十七:使用插件及maven上传制品到nexus
jenkins学习笔记之十七:使用插件及maven上传制品到nexus
|
3天前
|
Java 测试技术 Maven
|
11天前
|
Java Maven 开发者
"揭秘IDEA的神奇助手:Maven Helper插件,让你轻松驾驭复杂依赖,告别冲突噩梦!"
【8月更文挑战第20天】Maven Helper是一款提升Java开发者工作效率的IDEA插件,它能直观展示项目依赖关系并协助管理。主要功能包括依赖树视图、冲突检测与解决及依赖排除。安装简便,重启IDEA后即用。借助其“Dependencies”面板,开发者可以清晰了解依赖详情,快速定位并解决冲突问题,有效优化项目结构,提升开发效率。
27 0
|
13天前
|
Java 测试技术 Maven
Maven 插件
Maven 通过三大生命周期:clean(清理)、default(构建)、site(站点),标准化项目构建流程。每个生命周期由多个阶段组成,这些阶段的任务由 Maven 插件实现。例如,`mvn clean` 调用 clean 生命周期的 clean 阶段,实际工作由 maven-clean-plugin 完成。

推荐镜像

更多
下一篇
云函数