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

Maven使用${revision}实现多模块版本统一管理及注意事项

在 Maven 中,确实可以利用 ${revision} 来实现多模块项目的版本统一管理,尤其是在使用一些高级特性如 Maven Release Plugin 或者是在 CI/CD 流程中动态设置版本时。${revision} 是一个特殊的变量,它允许你在构建时动态地使用或设定项目的版本号,这对于自动化的版本管理和持续集成特别有用。

Maven Release Plugin 与 ${revision}

Maven Release Plugin 支持一种模式,可以在执行 mvn release:prepare 时自动替换 ${revision} 为当前的项目版本号。这在准备发布新版本时非常有用,因为你可以事先在 POM 文件中使用 ${revision},然后由插件根据实际情况填充正确的版本号。

示例

假设你有一个简单的多模块 Maven 项目结构,希望在不同模块的版本管理上利用 ${revision}

  1. 父 pom.xml 配置:

<project><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-parent</artifactId><version>${revision}</version><packaging>pom</packaging><properties><!-- 注意:此处也可以直接使用 ${revision},但在某些场景下可能不适用 --><revision>1.1.0-dev-SNAPSHOT</revision></properties><modules><module>module-a</module><module>module-b</module></modules><!-- 其他配置... -->
</project>
  1. 子模块 pom.xml 配置:

<project><parent><groupId>com.example</groupId><artifactId>my-parent</artifactId><version>${revision}</version></parent><modelVersion>4.0.0</modelVersion><artifactId>module-a</artifactId><!-- 由于继承了父 pom 的 ${revision},此处不需要单独定义版本 --><!-- 其他配置... -->
</project>

使用 Maven Release Plugin

为了使 ${revision} 能够正确解析并插入实际的版本号,你需要配置 Maven Release Plugin。在你的根 pom.xml 中添加以下插件配置:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-release-plugin</artifactId><version>3.0.0-M5</version><configuration><autoVersionSubmodules>true</autoVersionSubmodules><!-- 其他配置选项,比如标签格式、分支策略等 --></configuration></plugin></plugins>
</build>

打包配置

<build><pluginManagement><plugins><!-- maven-surefire-plugin 插件,用于运行单元测试。 --><!-- 注意,需要使用 3.0.X+,因为要支持 Junit 5 版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>${maven-surefire-plugin.version}</version></plugin><!-- maven-compiler-plugin 插件,解决 Lombok + MapStruct 组合 --><!-- https://stackoverflow.com/questions/33483697/re-run-spring-boot-configuration-annotation-processor-to-update-generated-metada --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven-compiler-plugin.version}</version><configuration><annotationProcessorPaths><path><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><version>${spring.boot.version}</version></path><path><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></path><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${mapstruct.version}</version></path></annotationProcessorPaths></configuration></plugin></plugins></pluginManagement><plugins><!-- 统一 revision 版本 --><plugin><groupId>org.codehaus.mojo</groupId><artifactId>flatten-maven-plugin</artifactId><version>${flatten-maven-plugin.version}</version><configuration><flattenMode>resolveCiFriendliesOnly</flattenMode><updatePomFile>true</updatePomFile></configuration><executions><execution><goals><goal>flatten</goal></goals><id>flatten</id><phase>process-resources</phase></execution><execution><goals><goal>clean</goal></goals><id>flatten.clean</id><phase>clean</phase></execution></executions></plugin></plugins></build><!-- 使用 huawei / aliyun 的 Maven 源,提升下载速度 --><repositories><!--      <repository><id>huaweicloud</id><name>huawei</name><url>https://mirrors.huaweicloud.com/repository/maven/</url></repository>--><repository><id>aliyunmaven</id><name>aliyun</name><url>https://maven.aliyun.com/repository/public</url></repository></repositories>

```

执行流程

  • 当你准备好发布项目时,运行 mvn release:prepare。这个命令会自动将 ${revision} 替换为当前的版本号(如从 1.0-SNAPSHOT 到 1.0),并相应地更新所有受影响的 POM 文件。

  • 接着,你可以运行 mvn release:perform 完成构建、测试并部署到你的仓库。

注意事项

  • 使用 ${revision} 需要谨慎,特别是在与其他插件或功能(如版本号范围)结合使用时,可能会遇到兼容性问题。

  • 确保你的 CI/CD 环境支持这种动态版本处理,并且团队成员都理解这一流程。

通过这种方式,Maven 和 ${revision} 可以帮助你高效地管理多模块项目的版本一致性,尤其是在频繁迭代和发布的场景下。

高级应用与最佳实践

动态版本控制策略

在复杂的CI/CD流程中,${revision} 的灵活性尤为显著。通过结合环境变量或CI服务器提供的特性(如GitLab CI/CD的 $CI_COMMIT_REF_NAME 或Jenkins的 $GIT_BRANCH),可以在不同的构建环境下指定或计算出特定的版本后缀,例如区分开发、测试和生产环境的构建。这样,你不仅能够确保版本的一致性,还能精确追踪每个构建产物对应的源代码状态。

自动化版本升级策略

利用 Maven Release Plugin 的同时,可以通过自定义脚本或使用更高级的Maven插件(如 Versions Maven Plugin)来进一步自动化版本管理过程。例如,在预发布阶段自动递增版本号(从 1.0.0 到 1.0.1-SNAPSHOT),或是基于语义化版本控制(SemVer)原则自动调整版本号以反映功能添加、bug修复或重大变更。

版本锁定与依赖管理

在多模块项目中,通过在父POM中统一管理 <dependencyManagement> 部分,可以确保所有子模块使用的依赖版本一致。当依赖的版本也使用 ${revision} 时,需注意这可能会引入依赖解析的不确定性,特别是在跨模块依赖的情况下。因此,对于公共依赖,明确指定版本号或通过属性管理具体版本是一种更为稳健的做法,以避免不必要的构建混乱。

回滚与审计

在使用 ${revision} 实现版本动态管理时,良好的回滚策略和版本审计变得尤为重要。确保每一次版本变更都能被清晰记录,并能迅速回退到之前的稳定版本。Maven的版本控制策略与版本控制系统(如Git)紧密结合,使得版本回溯和审计变得相对直观易行。

结论

综上所述,Maven中的 ${revision} 变量是实现多模块项目版本统一管理的强大工具,特别是在结合CI/CD流程和高级插件配置时。它不仅提升了版本控制的灵活性和自动化程度,还促进了开发团队之间的协作和构建过程的透明度。然而,要充分发挥其效能,还需深入理解其工作原理,谨慎设计版本策略,并确保整个团队对这一机制有共同的认知和操作规范。通过这些综合措施,可以有效提升软件开发的质量与效率,降低因版本管理不当带来的风险。

相关文章:

Maven使用${revision}实现多模块版本统一管理及注意事项

在 Maven 中&#xff0c;确实可以利用 ${revision} 来实现多模块项目的版本统一管理&#xff0c;尤其是在使用一些高级特性如 Maven Release Plugin 或者是在 CI/CD 流程中动态设置版本时。${revision} 是一个特殊的变量&#xff0c;它允许你在构建时动态地使用或设定项目的版本…...

vue2 bug求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)

我的vue2项目出现了一个超级恶心的bug 过程&#xff1a; 1 操作流程&#xff1a;页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 2 结果&#xff1a;返回页面后页面没有刷新导致用户名还显示着&#xff0c;页面没有发生任何变化&a…...

C++的“引用”是条寄生虫

在C中&#xff0c;引用&#xff08;reference&#xff09;是一个已存在变量的别名&#xff08;alias&#xff09;。比如鲁讯原名周树人&#xff0c;前者就是后者的别名。 一、引用的用法 定义引用时需要用到&&#xff0c;用法如下&#xff1a; int ival 9527; int &am…...

人体感应提醒 大声公+微波模块

文章目录 模块简介接线程序示例 模块简介 微波感应开关模块 RCWL-0516是一款采用多普勒雷达技术&#xff0c;专门检测物体移动的微波感应模块。采用 2.7G 微波信号检测&#xff0c;该模块具有灵敏度高&#xff0c;感应距离远&#xff0c;可靠性强&#xff0c;感应角度大&#…...

正确的功能可将热晶体管风速计线性化

处理传感器电路输出信号的电路或计算公式必须生成传感器响应的反函数。例如&#xff0c;如果传感器响应是对数函数&#xff0c;则线性化部分的响应必须是指数的。 这项工作首先获取传感器响应的 46 个离散点&#xff08;参见参考论文中的图 4&#xff09;。刚开始时&#xff0…...

小程序集arcgis地图显示自定义坐标的功能实现记录!(学习笔记)

最近再做一个新能源回收项目&#xff0c;项目中有个根据回收点坐标数据显示区域内回收点位置&#xff0c;点击图标直接导航到该位置&#xff0c;及分布的需求&#xff0c;研究了一下&#xff0c;实现效果如下&#xff0c;实现起来很简单&#xff0c;代码及效果 回收点位置及分…...

谷歌医疗大模型登Nature,Med-PaLM重磅揭秘!AI医生成绩比肩人类

5月I/O大会上&#xff0c;Med-PaLM 2重磅升级&#xff0c;甚至达到了专家水准。 今天&#xff0c;谷歌揭秘微调后的Med-PaLM&#xff0c;同样在医学问题上一骑绝尘。 研究成果已登Nature。 论文地址&#xff1a;https://www.nature.com/articles/s41586-023-06291-2 这项研究…...

java-字符串相关类的底层原理

在 Java 中&#xff0c;字符串处理是编程中的一个常见任务。Java 提供了多种字符串相关的类&#xff0c;如 String, StringBuilder, StringBuffer 和 CharSequence 等&#xff0c;以满足不同的需求。这些类的底层原理基于 Java 内部的数据结构和算法。在本教程中&#xff0c;我…...

C++模板编程—学习C++类库的编程基础

课程总目录 文章目录 一、详解函数模板二、类模板三、类模板实践&#xff1a;实现向量容器vector四、理解容器空间配置器allocator的重要性 一、详解函数模板 模板的意义&#xff1a;对类型也可以进行参数化了 // 也可以用template<class T>&#xff0c;但class容易和类…...

[每周一更]-(第99期):MySQL的索引为什么用B+树?

文章目录 B树与B树的基本概念B树&#xff08;Balanced Tree&#xff09;B树&#xff08;B-Plus Tree&#xff09;对比 为什么MySQL选择B树1. **磁盘I/O效率**2. **更稳定的查询性能**3. **更高的空间利用率**4. **并发控制** 其他树结构的比较参考 索引是一种 数据结构&#x…...

详解MySQL的MVCC机制

多版本并发控制&#xff08;MVCC&#xff0c;Multi-Version Concurrency Control&#xff09;是MySQL InnoDB存储引擎用于实现事务隔离和提高并发性能的一种机制。MVCC通过在同一数据的多个版本之间进行管理&#xff0c;允许读写操作并发进行&#xff0c;从而避免了传统锁机制带…...

docker部署skywalking

skywalking版本下载 1&#xff1a;拉取skywalking的oap镜像(可以选择自己的版本&#xff0c;最好与ui&#xff0c;agent版本一致) docker pull apache/skywalking-oap-server:9.5.02&#xff1a;启动oap docker run -d -p 11800:11800 -p 12800:12800 --name sw_oap apache/…...

Mac 使用Docker安装Elasticsearch、Kibana 、ik分词器、head

安装ElasticSearch 通过docker安装es docker pull elasticsearch:7.8.1 在本地创建elasticsearch.yml文件 mkdir /Users/ky/Documents/learn/es/elasticsearch.yml 编辑yml文件内容 http: host: 0.0.0.0 xpack.security.enabled: false xpack.security.enrollment.enabled: t…...

【Webpack4打包机制原理解析】

webpack是一个打包模块化 JavaScript 的工具&#xff0c;在 webpack里一切文件皆模块&#xff0c;通过 Loader 转换文件&#xff0c;通过 Plugin 注入钩子&#xff0c;最后输出由多个模块组合成的文件。webpack专注于构建模块化项目。 # 简单版打包模型步骤 我们先从简单的入手…...

如何提高接口响应速度

在非大数据&#xff08;几万以上记录&#xff09;的情况下&#xff0c;影响接口响应速度的因素中最大的是查询数据库的次数&#xff0c;其次才是数组遍历和简单数据处理&#xff08;如根据已有字段增加新的属性&#xff0c;或计算值&#xff09;。 一般一次数据库查询需要50毫秒…...

项目敏感配置信息加固

概述 引入jasypt做密码等敏感配置信息的加固 项目集成依赖 pom.xml引入jasypt-spring-boot-starter依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.…...

HCIA-AI课程大纲

该阶段详细介绍各个机器学习范式方法&#xff0c;涵盖有监督、无监督、半监督、强化学习&#xff0c;以及深度学习算法基础&#xff0c;共计 72 课时。 第一节&#xff1a;华为云 ModelArts 云服务开发环境搭建 - &#xff08;2 课时&#xff09; - 华为云 ModelArts 云服务简…...

keil program algorithm 出错

前段时间 在 调试下载算法时&#xff0c;遇到一个奇怪的问题 就是 加载下载算法后&#xff0c; 下载算法的RAM空间 大小不能修改为 单片机的最大RAM&#xff0c;只能改到最大4KB的空间大小, 再大就报错 刚开始报错 一直不知道原因&#xff0c;走了很多弯路&#xff0c; 到最…...

SITNE24V2BNQ-3/TR一种瞬态电压抑制器,对标PESD1CAN

SITNE24V2BNQ是一种瞬态电压抑制器&#xff0c;设计用于保护两个汽车控制器区域 网络(CAN)母线不受ESD等瞬变造成的损坏。 SITNE24V2BNQ采用SOT-23封装。标准产品不含铅和卤素。 产品参数 方向&#xff1a;双向通道数&#xff1a;2VRWM(V)(Max)&#xff1a;24IPP8/20μS(A)(M…...

Vue3【四】使用Vue2的写法写一个新的组件子组件和根组件

Vue3【四】使用Vue2的写法写一个新的组件 Vue3【四】使用Vue2的写法写一个新的组件 Vue3是向下兼容的&#xff0c;所有可以使用Vue的选项式写法 运行截图 目录结构 文件源码 App.vue <template><div class"app"><h1>你好世界! 我是App根组件<…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...

第22节 Node.js JXcore 打包

Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本&#xff0c;基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...

中科院1区顶刊|IF14+:多组学MR联合单细胞时空分析,锁定心血管代谢疾病的免疫治疗新靶点

中科院1区顶刊|IF14&#xff1a;多组学MR联合单细胞时空分析&#xff0c;锁定心血管代谢疾病的免疫治疗新靶点 当下&#xff0c;免疫与代谢性疾病的关联研究已成为生命科学领域的前沿热点。随着研究的深入&#xff0c;我们愈发清晰地认识到免疫系统与代谢系统之间存在着极为复…...