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

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…...

TCP三次握手全方面详解

文章目录 (1) 三次握手各状态CLOSE状态SYN_SENT状态SYN_RECV状态ESTABLISHED状态 (2) 为什么握手时的seqnum是随机值&#xff0c;以及acknum的功能(3) 三次握手中的半连接队列&#xff08;SYN队列&#xff09;和全连接队列&#xff08;ACCEPT队列&#xff09;半连接队列全连接队…...

【C#】一维、二维、三维数组的使用

在C#中&#xff0c;数组是用于存储固定数量相同类型元素的数据结构。根据维度的不同&#xff0c;可以分为一维数组、二维数组&#xff08;矩阵阵列&#xff09;、三维数组等。每增加一个维度&#xff0c;数据的组织方式就会变得更加复杂。 一维数组 一维数组是最简单的数组形…...

MIT开源7B推理模型Satori:用行动思维链进行强化学习,增强自回归搜索

自OpenAI的o1发布以来&#xff0c;研究社区为提升开源LLM的高级推理能力做出了诸多努力&#xff0c;包括使用强大的教师模型进行蒸馏、蒙特卡洛树搜索&#xff08;MCTS&#xff09;以及基于奖励模型的引导搜索等方法。 本研究旨在探索一个新的研究方向&#xff1a;使LLM具备自回…...

【JVM详解二】常量池

一、常量池概述 JVM的常量池主要有以下几种&#xff1a; class文件常量池运行时常量池字符串常量池基本类型包装类常量池 它们相互之间关系大致如下图所示&#xff1a; 每个 class 的字节码文件中都有一个常量池&#xff0c;里面是编译后即知的该 class 会用到的字面量与符号引…...

w200基于spring boot的个人博客系统的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…...

【算法】快速排序算法的实现:C 和 C++ 版本

1. 算法简介 快速排序(Quick Sort)是由英国计算机科学家霍尔(C.A.R. Hoare)在1960年提出的一种高效的排序算法。它采用了分治法(Divide and Conquer)策略,通常具有很好的性能。在平均情况下,快速排序的时间复杂度为 O(n log n),但在最坏情况下可能退化为 O(n^2),不过…...

前沿科技一览未来发展趋势

脑机接口技术在医疗康复领域有了新进展。这技术让机器读懂大脑信号&#xff0c;帮助病人找回身体功能。 比如&#xff0c;瘫痪人士可以用它来控制假肢。在美国&#xff0c;一名瘫痪者通过这个技术&#xff0c;能用自己意念控制机械臂&#xff0c;喝到饮料。这种技术对提升患者…...

js滚动到页面最底部

setTimeout(()> { //延后执行&#xff0c;等页面渲染结束let container document.querySelector(.raise-flag-content); //找到当前divif (container) {container.scrollTop container.scrollHeight - (container.clientHeight - 400 );}})container.scrollTop container…...

视觉硬件选型和算法选择(CNN)

基础知识 什么是机械视觉: 机械视觉是一种利用机器代替人眼来进行测量和判断的技术&#xff0c;通过光学系统、图像传感器等设备获取图像&#xff0c;并运用图像处理和分析算法来提取信息&#xff0c;以实现对目标物体的识别、检测、测量和定位等功能。 机械视觉与人类视觉有什…...

Mybatis篇

1&#xff0c;什么是Mybatis &#xff08; 1 &#xff09;Mybatis 是一个半 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了 JDBC&#xff0c;开发时只需要关注 SQL 语句本身&#xff0c;不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁…...

【Python】元组

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;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&#xff0c;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和时间管理功能

背景 学习目的&#xff1a;熟悉Cursor使用环境&#xff0c;跑通基本开发链路。 本人背景&#xff1a;安卓开发不熟悉&#xff0c;了解科技软硬件常识 实践 基础操作 1&#xff0c;下载安装安卓Android Studio 创建一个empty project 工程&#xff0c;名称为helloworld 2&am…...

Redis数据库(二):Redis 常用的五种数据结构

Redis 能够做到高性能的原因主要有两个&#xff0c;一是它本身是内存型数据库&#xff0c;二是采用了多种适用于不同场景的底层数据结构。 Redis 常用的数据结构支持字符串、列表、哈希表、集合和有序集合。实现这些数据结构的底层数据结构有 6 种&#xff0c;分别是简单动态字…...

【计组】实验五 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 交互窗口部署&#xff1a;基于docker安装&#xff0c;且支持联网搜索 Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 AI 平台&#xff0c;旨在完全离线操作。它支持各种 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%以上&#xff0c;且一直下不来。截图如下&#xff1a; 原因分析 1、确定mysql具体的占用内存大小&#xff0c;通过命令&#xff1a;cat /proc/Mysql进程ID/status查看 命令执行后的结果比较多&#xff08;其他参数的含义想了解可参考这…...

mysql8 从C++源码角度看sql生成抽象语法树

在 MySQL 8 的 C 源码中&#xff0c;SQL 语句的解析过程涉及多个步骤&#xff0c;包括词法分析、语法分析和抽象语法树&#xff08;AST&#xff09;的生成。以下是详细的解析过程和相关组件的描述&#xff1a; 1. 词法分析器&#xff08;Lexer&#xff09; MySQL 使用一个称为…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

基于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…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...