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

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.02.0 之间的所有版本(包含 1.02.0
[1.0,2.0)允许 1.02.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.02.03.04.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-lang33.8.0 版本,可能会造成版本冲突。

解决方法

  1. 使用 mvn dependency:tree 命令分析依赖树

    mvn dependency:tree
    

    这将列出所有的依赖关系,帮助分析冲突的依赖版本。

  2. 显式声明依赖
    pom.xml 直接声明想要使用的版本:

    <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
    </dependency>
    
  3. 使用 dependencyManagement
    pom.xml 中使用 <dependencyManagement> 显式指定依赖版本,确保所有子模块使用相同的版本:

    <dependencyManagement><dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency></dependencies>
    </dependencyManagement>
    
  4. 使用 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 分析并通过 dependencyManagementexclusions 解决

Maven 提供了一整套强大的 版本管理依赖解析机制,掌握这些概念后,你可以更轻松地管理项目依赖,避免因版本问题导致的构建失败或运行错误!🚀

相关文章:

Maven 版本管理与 SNAPSHOT 详解

1. Maven 版本管理概述 在 Maven 项目中&#xff0c;版本号&#xff08;Version&#xff09;是用于区分不同软件版本的重要标识。Maven 提供了一套标准的版本管理机制&#xff0c;包括&#xff1a; 正式版本&#xff08;Release Version&#xff09;快照版本&#xff08;SNAP…...

基于 GEE 利用 SDWI 指数进行逐月水域面积提取

目录 1 SDWI指数 2 完整代码 3 运行结果 微波遥感具有全天候、全天时工作能力&#xff0c;能穿透云层&#xff0c;不受气象条件和光照水平影响&#xff0c;因此近年来利用微波遥感提取水体信息也备受关注。本文分享使用 Sentinel-1遥感影像通过SDWI指数来进行逐月水域面积计…...

XMind 下载与使用教程:附百度网盘地址

一、引言 在信息爆炸的时代&#xff0c;如何高效地整理和管理知识成为了许多人面临的挑战。XMind 作为一款功能强大的思维导图软件&#xff0c;能够帮助我们清晰地梳理思路、整合信息&#xff0c;从而提升学习和工作效率。本文将详细介绍 XMind 的下载方法 二、XMind 的下载与…...

[EAI-034] 通过在线强化学习改进VLA模型

Paper Card 论文标题&#xff1a;Improving Vision-Language-Action Model with Online Reinforcement Learning 论文作者&#xff1a;Yanjiang Guo, Jianke Zhang, Xiaoyu Chen, Xiang Ji, Yen-Jen Wang, Yucheng Hu, Jianyu Chen 论文链接&#xff1a;https://arxiv.org/abs/…...

Python 和 JavaScript 中 Yield 的区别

Python 和 JavaScript 中 Yield 的区别 目录 Python 和 JavaScript 中 Yield 的区别PythonyieldJavaScriptyieldPythonyield fromJavaScriptyield* 推荐超级课程&#xff1a; Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 Pythonyield 在 Python 中…...

每日学习 设计模式 五种不同的单例模式

狮子大佬原文 https://blog.csdn.net/weixin_40461281/article/details/135050977 第一种 饿汉式 为什么叫饿汉,指的是"饿" 也就是说对象实例在程序启动时就已经被创建好,不管你是否需要,它都会在类加载时立即实例化,也就是说 实例化是在类加载时候完成的,早早的吃…...

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之上传头像和新增收货地址

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【Spring篇】【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f680;1.上传头像 -持久…...

SSM仓库物品管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.用户登录代码&#xff1a;2.保存物品信息代码&#xff1a;3.删除仓库信息代码&#xff1a; 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SSM框架开发的仓库…...

C++11新特性之unique_ptr智能指针

本节继续介绍智能指针&#xff0c;不了解的读者可以先阅读——C11新特性之shared_ptr智能指针-CSDN博客 1.介绍 unique_ptr是C11标准提供的另一种智能指针。与shared_ptr不同的是&#xff0c;unique_ptr指针指向的堆内存无法同其他unique_ptr共享&#xff0c;也就是每一片堆内…...

模型压缩 --学习记录2

模型压缩 --学习记录2 如何找到更好的权衡方式(模型量化)方法一:寻找更好的 range方法二:寻找更好的 X-fp32(浮点数)方法三:寻找更好的 scale 和 zp方法四:寻找更好的 roundPTQ 后训练量化(离线量化)QAT 量化感知训练(在线量化)量化为什么会带来加速?三、模型稀疏技…...

车载诊断工具技巧 --- CAPL Debug 功能使用介绍

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…...

Sinusoidal(正弦曲线)位置编码公式详细推导过程

Sinusoidal(正弦曲线)位置编码公式推导 参考链接 Transformer升级之路&#xff1a;1、Sinusoidal位置编码追根溯源 1. 前置数学的基本概念 1.1 内积 定义&#xff1a; 内积是两个向量之间的一种运算&#xff0c;其结果为一个标量。公式&#xff1a; 对于向量 a [ a 1 , …...

<论文>DeepSeek-R1:通过强化学习激励大语言模型的推理能力(深度思考)

一、摘要 本文跟大家来一起阅读DeepSeek团队发表于2025年1月的一篇论文《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning | Papers With Code》&#xff0c;新鲜的DeepSeek-R1推理模型&#xff0c;作者规模属实庞大。如果你正在使用Deep…...

萌新学 Python 之字符串及字符串相关函数

字符串&#xff1a;单引号、双引号、三个单引号、三个双引号 字符串属于不可变的数据类型&#xff0c;一旦被定义&#xff0c;内存地址不变 name 张三 # 字符串赋值给name后&#xff0c;内存地址存储张三&#xff0c;地址不变 username 张三 # 张三去内存中找…...

如何改善RK3588基于MPP的H265传输码率

1、降低帧率 由原来的30fps修改为25fps&#xff0c;具体修改如下&#xff1a; H265Level level H264Level::L_1080P_30FPS;修改为 H265Level level H264Level::L_1080P_25FPS; 同时修改在MppInit函数中修改如下内容&#xff1a; uint32_t fps 30;修改为uint32_t fps 2…...

系统思考—自我超越

“人们往往认为是个人的能力限制了他们&#xff0c;但事实上&#xff0c;是组织的结构和惯性思维限制了他们的潜力。”—彼得圣吉 最近和一家行业隐形冠军交流&#xff0c;他们已经是领域第一&#xff0c;老板却依然要求&#xff1a;核心团队都要自我超越&#xff0c;攻坚克难…...

redis高级数据结构Stream

文章目录 背景stream概述消息 ID消息内容常见操作独立消费创建消费组消费 Stream弊端Stream 消息太多怎么办?消息如果忘记 ACK 会怎样?PEL 如何避免消息丢失?分区 Partition Stream 的高可用总结 背景 为了解决list作为消息队列是无法支持消息多播问题&#xff0c;Redis5.0…...

day44 QT核心机制

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QLabel> //标签类头文件 #include<QPushButton> //按钮类头文件 #include<QLineEdit> //行编辑器类头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; } …...

打家劫舍3

今天和打家讲一下打家劫舍3 题目&#xff1a; 题目链接&#xff1a;337. 打家劫舍 III - 力扣&#xff08;LeetCode&#xff09; 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为root。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“…...

webpack配置之---上下文

context context 是 Webpack 配置中的一个重要属性&#xff0c;它主要用于确定模块解析时的基础目录。可以理解为是 Webpack 在解析模块时&#xff0c;基于哪个目录作为根路径来查找模块。context 的默认值是 process.cwd()&#xff0c;即当前执行 Webpack 命令时的工作目录。…...

Spring Boot: 使用 @Transactional 和 TransactionSynchronization 在事务提交后发送消息到 MQ

Spring Boot: 使用 Transactional 和 TransactionSynchronization 在事务提交后发送消息到 MQ 在微服务架构中&#xff0c;确保消息的可靠性和一致性非常重要&#xff0c;尤其是在涉及到分布式事务的场景中。本文将演示如何使用 Spring Boot 的事务机制和 TransactionSynchron…...

2024中国行政区划多边形矢量数据(含有十段线)仅供学习

中国标准行政区划数据GS&#xff08;2024&#xff09;0650号&#xff0c;包括&#xff1a; 分省市县 省内分市 省内分县 南海十段线与岛屿区域 全国市级行政区划 通过网盘分享的文件&#xff1a;中国标准行政区划数据GS&#xff08;2024&#xff09;0650号.rar等4个文件 链接…...

给底部导航栏添加图形

文章目录 1. 概念介绍2. 修改方法2.1 修改属性2.2 包裹容器2.3 剪裁形状3. 代码与效果3.1 示例代码3.2 运行效果4. 内容总结我们在上一章回中介绍了"NavigationBar组件"相关的内容,本章回中将介绍如何修改NavigationBar组件的形状.闲话休提,让我们一起Talk Flutter…...

DeepSeek-R1 智能知识库系统使用指南

DeepSeek-R1 智能知识库系统使用指南 第一部分 基础操作教程 1.1 系统初始化 // 示例命令 > /initialize --configenterprise_knowledge --languagezh-CN [系统响应] 已加载企业知识图谱&#xff08;含12万实体/35万关系&#xff09;NLP引擎切换为中文混合语义模型1.2 基…...

#渗透测试#批量漏洞挖掘#WookTeam searchinfo SQL注入漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概述 二、漏洞成因分析 1. 代码…...

leetcode 做题思路快查

128. 最长连续序列 arr 1 2 3 4 100 200; A. for将元素加入hash_set; B.对于每个x, x-1不在hash_set则x是bengin节点&#xff0c;begin_vev 1 , 100 , 200; C. 对于bengin_vec中&#xff0c;如果x在hash_set&#xff0c;则序列长度 151. 反转字符串中的单词151. 反转字符串…...

HarmonyOS Next 方舟字节码文件格式介绍

在开发中&#xff0c;可读的编程语言要编译成二进制的字节码格式才能被机器识别。在HarmonyOS Next开发中&#xff0c;arkts会编译成方舟字节码。方舟字节码长什么样呢&#xff1f;我们以一个demo编译出的abc文件&#xff1a; 二进制就是长这样&#xff0c;怎么去理解呢&…...

iOS主要知识点梳理回顾-2-多线程

iOS的多线程主要有三种方式&#xff0c;NSThread、GCD&#xff08;Grand Central Dispatch&#xff09;NSOperationQueue 开始&#xff0c;在iOS2发布的时候&#xff0c;苹果同步推出了NSthread和NSOperation。其中NSthread比较简单&#xff0c;仅提供了创建队列、开始、取消、…...

WPS如何接入DeepSeek(通过JS宏调用)

WPS如何接入DeepSeek 一、文本扩写二、校对三、翻译 本文介绍如何通过 WPS JS宏调用 DeepSeek 大模型&#xff0c;实现自动化文本扩写、校对和翻译等功能。 一、文本扩写 1、随便打开一个word文档&#xff0c;点击工具栏“工具”。 2、点击“开发工具”。 3、点击“查看代码”…...

【课程设计参考】迷宫小游戏 :基于 Python+Pygame+AI算法

一、内容 实现走迷宫 &#xff08;1&#xff09;游戏界面显示&#xff1a;迷宫地图、上下左右移动的特效。 &#xff08;2&#xff09;动作选择&#xff1a;上下左右键对应于上下左右的移动功能&#xff0c;遇到障碍的处理。 &#xff08;3&#xff09;得分统计功能&#xff…...