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

vue2 bug求助!!!(未解决,大概是浏览器缓存的问题或者是路由的问题)
我的vue2项目出现了一个超级恶心的bug 过程: 1 操作流程:页面a点击a标签->到页面b->页面b用户退出刷新页面->点击浏览器的返回按钮返回上一页 2 结果:返回页面后页面没有刷新导致用户名还显示着,页面没有发生任何变化&a…...

C++的“引用”是条寄生虫
在C中,引用(reference)是一个已存在变量的别名(alias)。比如鲁讯原名周树人,前者就是后者的别名。 一、引用的用法 定义引用时需要用到&,用法如下: int ival 9527; int &am…...

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

正确的功能可将热晶体管风速计线性化
处理传感器电路输出信号的电路或计算公式必须生成传感器响应的反函数。例如,如果传感器响应是对数函数,则线性化部分的响应必须是指数的。 这项工作首先获取传感器响应的 46 个离散点(参见参考论文中的图 4)。刚开始时࿰…...

小程序集arcgis地图显示自定义坐标的功能实现记录!(学习笔记)
最近再做一个新能源回收项目,项目中有个根据回收点坐标数据显示区域内回收点位置,点击图标直接导航到该位置,及分布的需求,研究了一下,实现效果如下,实现起来很简单,代码及效果 回收点位置及分…...

谷歌医疗大模型登Nature,Med-PaLM重磅揭秘!AI医生成绩比肩人类
5月I/O大会上,Med-PaLM 2重磅升级,甚至达到了专家水准。 今天,谷歌揭秘微调后的Med-PaLM,同样在医学问题上一骑绝尘。 研究成果已登Nature。 论文地址:https://www.nature.com/articles/s41586-023-06291-2 这项研究…...
java-字符串相关类的底层原理
在 Java 中,字符串处理是编程中的一个常见任务。Java 提供了多种字符串相关的类,如 String, StringBuilder, StringBuffer 和 CharSequence 等,以满足不同的需求。这些类的底层原理基于 Java 内部的数据结构和算法。在本教程中,我…...
C++模板编程—学习C++类库的编程基础
课程总目录 文章目录 一、详解函数模板二、类模板三、类模板实践:实现向量容器vector四、理解容器空间配置器allocator的重要性 一、详解函数模板 模板的意义:对类型也可以进行参数化了 // 也可以用template<class T>,但class容易和类…...

[每周一更]-(第99期):MySQL的索引为什么用B+树?
文章目录 B树与B树的基本概念B树(Balanced Tree)B树(B-Plus Tree)对比 为什么MySQL选择B树1. **磁盘I/O效率**2. **更稳定的查询性能**3. **更高的空间利用率**4. **并发控制** 其他树结构的比较参考 索引是一种 数据结构&#x…...
详解MySQL的MVCC机制
多版本并发控制(MVCC,Multi-Version Concurrency Control)是MySQL InnoDB存储引擎用于实现事务隔离和提高并发性能的一种机制。MVCC通过在同一数据的多个版本之间进行管理,允许读写操作并发进行,从而避免了传统锁机制带…...

docker部署skywalking
skywalking版本下载 1:拉取skywalking的oap镜像(可以选择自己的版本,最好与ui,agent版本一致) docker pull apache/skywalking-oap-server:9.5.02:启动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 的工具,在 webpack里一切文件皆模块,通过 Loader 转换文件,通过 Plugin 注入钩子,最后输出由多个模块组合成的文件。webpack专注于构建模块化项目。 # 简单版打包模型步骤 我们先从简单的入手…...
如何提高接口响应速度
在非大数据(几万以上记录)的情况下,影响接口响应速度的因素中最大的是查询数据库的次数,其次才是数组遍历和简单数据处理(如根据已有字段增加新的属性,或计算值)。 一般一次数据库查询需要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课程大纲
该阶段详细介绍各个机器学习范式方法,涵盖有监督、无监督、半监督、强化学习,以及深度学习算法基础,共计 72 课时。 第一节:华为云 ModelArts 云服务开发环境搭建 - (2 课时) - 华为云 ModelArts 云服务简…...

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

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

Vue3【四】使用Vue2的写法写一个新的组件子组件和根组件
Vue3【四】使用Vue2的写法写一个新的组件 Vue3【四】使用Vue2的写法写一个新的组件 Vue3是向下兼容的,所有可以使用Vue的选项式写法 运行截图 目录结构 文件源码 App.vue <template><div class"app"><h1>你好世界! 我是App根组件<…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...