Maven 版本管理与 SNAPSHOT 详解
1. Maven 版本管理概述
在 Maven 项目中,版本号(Version)是用于区分不同软件版本的重要标识。Maven 提供了一套标准的版本管理机制,包括:
- 正式版本(Release Version)
- 快照版本(SNAPSHOT Version)
- 版本范围(Version Ranges)
- 依赖版本冲突解决
良好的版本管理有助于提高项目的可维护性和稳定性,使团队能够更好地进行版本控制和依赖管理。
2. SNAPSHOT 版本 vs. 发布版本
在 Maven 中,版本号通常采用 major.minor.patch 的格式,例如:
<version>1.0.0</version>
但在实际开发过程中,我们需要区分 稳定的发布版本(Release) 和 开发中的快照版本(SNAPSHOT)。
2.1 SNAPSHOT 版本
SNAPSHOT(快照版本)是一种特殊的 Maven 版本标识,表示该版本仍在开发中,可能会不断更新。
-
命名格式:
1.0.0-SNAPSHOT -
特点:
- SNAPSHOT 版本不是最终发布版本,表示该版本仍在开发中,可能会发生变更。
- 每次构建 SNAPSHOT 版本时,Maven 会检查远程仓库是否有更新的 SNAPSHOT 版本,并自动下载最新版本。
- SNAPSHOT 版本通常用于开发和测试,不适用于生产环境。
-
示例:SNAPSHOT 版本声明
<dependency><groupId>com.example</groupId><artifactId>my-library</artifactId><version>1.0.0-SNAPSHOT</version> </dependency> -
如何发布 SNAPSHOT 版本
mvn clean deploy -
如何强制更新 SNAPSHOT 版本
mvn clean install -U-U选项表示强制更新 SNAPSHOT 依赖。
2.2 正式发布版本(Release Version)
发布版本是经过测试和验证的最终版本,适用于生产环境。
-
命名格式:
1.0.0 -
特点:
- 一旦发布,不会再更改(Immutable)。
- 不会自动检查更新,确保稳定性。
- 适用于生产环境,不能随意变更。
-
示例:正式版本声明
<dependency><groupId>com.example</groupId><artifactId>my-library</artifactId><version>1.0.0</version> </dependency> -
如何发布正式版本
mvn release:prepare mvn release:perform
3. 版本范围管理
在 Maven 中,可以使用 版本范围 来控制依赖的版本选择,常见的版本范围如下:
| 版本范围 | 描述 |
|---|---|
[1.0] | 只允许 1.0 版本 |
[1.0,2.0] | 允许 1.0 到 2.0 之间的所有版本(包含 1.0 和 2.0) |
[1.0,2.0) | 允许 1.0 到 2.0 之间的版本(不包含 2.0) |
(1.0,2.0] | 允许 1.0 之后的版本,直到 2.0(包含 2.0) |
(,1.0] | 允许 1.0 及之前的所有版本 |
[1.0,) | 允许 1.0 及之后的所有版本 |
[1.0,2.0],[3.0,4.0] | 允许 1.0 到 2.0 和 3.0 到 4.0 之间的版本 |
示例:
<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>[5.3.0,5.4.0)</version>
</dependency>
此配置表示 Maven 允许使用 5.3.0 及以上但低于 5.4.0 的版本。
4. 版本冲突与解决
4.1 依赖传递
Maven 允许依赖的传递性,即如果 A 依赖 B,而 B 依赖 C,那么 A 会自动继承 C 的依赖。
例如:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.5.0</version>
</dependency>
spring-boot-starter-web 可能会间接依赖 spring-core,Maven 会自动解析并下载 spring-core 的正确版本。
4.2 依赖冲突
当多个依赖引入了同一个库的不同版本时,就会发生依赖冲突。
示例
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency><dependency><groupId>some-library</groupId><artifactId>some-library</artifactId><version>1.0.0</version>
</dependency>
如果 some-library 依赖于 commons-lang3 的 3.8.0 版本,可能会造成版本冲突。
解决方法
-
使用
mvn dependency:tree命令分析依赖树mvn dependency:tree这将列出所有的依赖关系,帮助分析冲突的依赖版本。
-
显式声明依赖
在pom.xml直接声明想要使用的版本:<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> </dependency> -
使用
dependencyManagement
在pom.xml中使用<dependencyManagement>显式指定依赖版本,确保所有子模块使用相同的版本:<dependencyManagement><dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency></dependencies> </dependencyManagement> -
使用
exclusions排除不需要的传递依赖<dependency><groupId>some-library</groupId><artifactId>some-library</artifactId><version>1.0.0</version><exclusions><exclusion><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></exclusion></exclusions> </dependency>
5. 总结
| 概念 | 描述 |
|---|---|
| SNAPSHOT 版本 | 开发中的版本,每次构建可能不同,不适用于生产环境 |
| 正式发布版本(Release) | 生产环境使用的稳定版本 |
| 版本范围 | 允许指定依赖版本范围,如 [1.0,2.0] |
| 依赖传递 | 自动引入间接依赖,可能导致版本冲突 |
| 版本冲突解决 | 使用 mvn dependency:tree 分析并通过 dependencyManagement 或 exclusions 解决 |
Maven 提供了一整套强大的 版本管理 和 依赖解析机制,掌握这些概念后,你可以更轻松地管理项目依赖,避免因版本问题导致的构建失败或运行错误!🚀
相关文章:
Maven 版本管理与 SNAPSHOT 详解
1. Maven 版本管理概述 在 Maven 项目中,版本号(Version)是用于区分不同软件版本的重要标识。Maven 提供了一套标准的版本管理机制,包括: 正式版本(Release Version)快照版本(SNAP…...
TCP三次握手全方面详解
文章目录 (1) 三次握手各状态CLOSE状态SYN_SENT状态SYN_RECV状态ESTABLISHED状态 (2) 为什么握手时的seqnum是随机值,以及acknum的功能(3) 三次握手中的半连接队列(SYN队列)和全连接队列(ACCEPT队列)半连接队列全连接队…...
【C#】一维、二维、三维数组的使用
在C#中,数组是用于存储固定数量相同类型元素的数据结构。根据维度的不同,可以分为一维数组、二维数组(矩阵阵列)、三维数组等。每增加一个维度,数据的组织方式就会变得更加复杂。 一维数组 一维数组是最简单的数组形…...
MIT开源7B推理模型Satori:用行动思维链进行强化学习,增强自回归搜索
自OpenAI的o1发布以来,研究社区为提升开源LLM的高级推理能力做出了诸多努力,包括使用强大的教师模型进行蒸馏、蒙特卡洛树搜索(MCTS)以及基于奖励模型的引导搜索等方法。 本研究旨在探索一个新的研究方向:使LLM具备自回…...
【JVM详解二】常量池
一、常量池概述 JVM的常量池主要有以下几种: class文件常量池运行时常量池字符串常量池基本类型包装类常量池 它们相互之间关系大致如下图所示: 每个 class 的字节码文件中都有一个常量池,里面是编译后即知的该 class 会用到的字面量与符号引…...
w200基于spring boot的个人博客系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
【算法】快速排序算法的实现:C 和 C++ 版本
1. 算法简介 快速排序(Quick Sort)是由英国计算机科学家霍尔(C.A.R. Hoare)在1960年提出的一种高效的排序算法。它采用了分治法(Divide and Conquer)策略,通常具有很好的性能。在平均情况下,快速排序的时间复杂度为 O(n log n),但在最坏情况下可能退化为 O(n^2),不过…...
前沿科技一览未来发展趋势
脑机接口技术在医疗康复领域有了新进展。这技术让机器读懂大脑信号,帮助病人找回身体功能。 比如,瘫痪人士可以用它来控制假肢。在美国,一名瘫痪者通过这个技术,能用自己意念控制机械臂,喝到饮料。这种技术对提升患者…...
js滚动到页面最底部
setTimeout(()> { //延后执行,等页面渲染结束let container document.querySelector(.raise-flag-content); //找到当前divif (container) {container.scrollTop container.scrollHeight - (container.clientHeight - 400 );}})container.scrollTop container…...
视觉硬件选型和算法选择(CNN)
基础知识 什么是机械视觉: 机械视觉是一种利用机器代替人眼来进行测量和判断的技术,通过光学系统、图像传感器等设备获取图像,并运用图像处理和分析算法来提取信息,以实现对目标物体的识别、检测、测量和定位等功能。 机械视觉与人类视觉有什…...
Mybatis篇
1,什么是Mybatis ( 1 )Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁…...
【Python】元组
个人主页:GUIQU. 归属专栏:Python 文章目录 1. 元组的本质与基础概念1.1 不可变序列的意义1.2 元组与数学概念的联系 2. 元组的创建方式详解2.1 标准创建形式2.2 单元素元组的特殊处理2.3 使用 tuple() 函数进行转换 3. 元组的基本操作深入剖析3.1 索引操…...
【AI实践】deepseek支持升级git
当前Windows 11 WSL的git是2.17,Android Studio提示需要升级到2.19版本 网上找到指导文章 安装git 2.19.2 cd /usr/src wget https://www.kernel.org/pub/software/scm/git/git-2.19.2.tar.gz tar xzf git-2.19.2.tar.gz cd git-2.19.2 make prefix/usr/l…...
【AI实践】Cursor上手-跑通Hello World和时间管理功能
背景 学习目的:熟悉Cursor使用环境,跑通基本开发链路。 本人背景:安卓开发不熟悉,了解科技软硬件常识 实践 基础操作 1,下载安装安卓Android Studio 创建一个empty project 工程,名称为helloworld 2&am…...
Redis数据库(二):Redis 常用的五种数据结构
Redis 能够做到高性能的原因主要有两个,一是它本身是内存型数据库,二是采用了多种适用于不同场景的底层数据结构。 Redis 常用的数据结构支持字符串、列表、哈希表、集合和有序集合。实现这些数据结构的底层数据结构有 6 种,分别是简单动态字…...
【计组】实验五 J型指令设计实验
目录 一、实验目的 二、实验环境 三、实验原理 四、实验任务 代码 一、实验目的 1. 理解MIPS处理器指令格式及功能。 2. 掌握lw, sw, beq, bne, lui, j, jal指令格式与功能。 3. 掌握ModelSim和ISE\Vivado工具软件。 4. 掌握基本的测试代码编写和FPGA开发板使用方法。 …...
ubuntu 本地部署deepseek r1 蒸馏模型
本文中的文件路径或网络代理需要根据自身环境自行删改 一、交互式chat页面 1.1 open-webui 交互窗口部署:基于docker安装,且支持联网搜索 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台,旨在完全离线操作。它支持各种 LLM…...
RestTemplate Https 证书访问错误
错误信息 resttemplate I/O error on GET request for “https://21.24.6.6:9443/authn-api/v5/oauth/token”: java.security.cert.CertificateException: No subject alternative names present; nested exception is javax.net.ssl.SSLHandshakeException: java.security.c…...
MySQL内存使用率高且不释放问题排查与总结
背景 生产环境mysql 5.7内存占用超过90%以上,且一直下不来。截图如下: 原因分析 1、确定mysql具体的占用内存大小,通过命令:cat /proc/Mysql进程ID/status查看 命令执行后的结果比较多(其他参数的含义想了解可参考这…...
mysql8 从C++源码角度看sql生成抽象语法树
在 MySQL 8 的 C 源码中,SQL 语句的解析过程涉及多个步骤,包括词法分析、语法分析和抽象语法树(AST)的生成。以下是详细的解析过程和相关组件的描述: 1. 词法分析器(Lexer) MySQL 使用一个称为…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
