MAVEN-SNAPSHOT和RELEASE

news2025/2/25 6:09:08

一、快照版本SNAPSHOT和发布版本RELEASE区别

快照版本SNAPSHOT和发布版本RELEASE区别-CSDN博客

在使⽤maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能⼀天就要发布⼀次,遇到bug时,甚⾄⼀天要发布N次。我们知道,maven的依赖管理是基于版本管理的,对于发布状态的artifact,如果版本号相同,即使我们内部的镜像服务器上的组件⽐本地新,maven也不会主动下载的。如果我们在开发阶段都是基于正式发布版本来做依赖管理,那么遇到这个问题,就需要升级组件的版本号,可这样就明显不符合要求和实际情况了。但是,如果是基于快照版本,那么问题就⾃热⽽然的解决了,⽽maven已经为我们准备好了这⼀切。

maven中的仓库分为两种,snapshot快照仓库和release发布仓库。snapshot快照仓库⽤于保存开发过程中的不稳定版本,release正式仓库则是⽤来保存稳定的发⾏版本。定义⼀个组件/模块为快照版本,只需要在pom⽂件中在该模块的版本号后加上-SNAPSHOT即可(注意这⾥必须是⼤写),如下:

<artifactId>bty-catering-platform-api</artifactId>
<version>1.1.2-SNAPSHOT</version>
<name>api</name>
<description>api</description>

如果是快照版本,那么在mvn deploy时会⾃动发布到快照版本库中,会覆盖⽼的快照版本。在使⽤快照版本的模块,在不更改版本号的情况下,直接编译打包时,maven会⾃动从镜像服务器上下载最新的快照版本。

如果是正式发布版本,那么在mvn deploy时会⾃动发布到正式版本库中,⽽使⽤正式版本的模块,在不更改版本号的情况下,编译打包时如果本地已经存在该版本的模块则不会主动去镜像服务器上下载.

所以,我们在开发阶段,可以将公⽤库的版本设置为快照版本,⽽被依赖组件则引⽤快照版本进⾏开发,在公⽤库的快照版本更新后,我们也不需要修改pom⽂件提示版本号来下载新的版本,直接mvn执⾏相关编译、打包命令即可重新下载最新的快照库了,从⽽也⽅便了我们进⾏开发。

⽬前在JAVA的世界中,maven已经成为事实上的构建标准,很多开源库的管理构建也是基于maven的,maven本身的学习曲线⽐较陡峭,遵循“约定优于配置”的理念,maven存在很多约定。

本次我先描述下,关于版本的定义的选择,SNAPSHOT or RELEASE?

版本之争

在maven的约定中,依赖的版本分为两类——SNAPSHOT和RELEASE。SNAPSHOT依赖泛指以SNAPSHOT为结尾的版本号,例如1.0.1-SNAPSHOT。除此之外,所有⾮-SNAPSHOT结尾的版本号则都被认定为RELEASE版本,即正式版,虽然会有beta、rc之类说法,但是这些只是软件⼯程⻆度的测试版,对于maven⽽⾔,这些都是RELEASE版本。既然Maven提供了这两类版本号,那么他们之前的优劣势是什么?分别在什么场景下使⽤?

解读SNAPSHOT

同⼀个SNAPSHOT版本的依赖可以多次发布(deploy)到仓库中,也就是说同⼀个SNAPSHOT版本的依赖可以在仓库中存在多份,每⼀份都是代码在某⼀个特定时间的快照,这也是SNAPSHOT的含义。SNAPSHOT不是⼀个特定的版本,⽽是⼀系列的版本的集合,其中HEAD总是指向最新的快照,对外界可⻅的⼀般也是最新版,这种给⼈的假象是新的覆盖了⽼的,从⽽使得使⽤SNAPSHOT依赖的客户端总是通过重新构建(有时候需要-U强制更新)就可以拿到最新的代码。例如:A-->B-1.3.8-SNAPSHOT(理解为A依赖了B的1.3.8-SNAPSHOT版本),那么B-1.3.8-SNAPSHOT更新之后重新deploy到仓库之后,A只需要重新构建就可以拿到最新的代码,并不需要改变依赖B的版本。由此可⻅,这样达到了变更传达的透明性,这对于开发过程中的团队协作的帮助不⾔⽽喻。

SNAPSHOT之殇

SNAPSHOT版本的依赖因为存在变更传达的透明性的优势⽽被赏识,甚⾄被“溺爱”,有很多团队索性直接使⽤SNAPSHOT到⽣产环境中,这样对于变更直接⽣效,很⽅便。但是作为技术⼈员的我们其实应该很严谨地看待变更传达的透明性,变更就意味着⻛险,透明性更是把⻛险彻底隐藏了起来,⽣产环境中存在这样的现象更是⼼惊胆战。例如:A-->B.1.0.3-SNAPSHOT,B对⼀个A使⽤的功能实现进⾏了调整,直接发布到仓库,A重新构建或许就会失败,更糟糕的是构建成功,运⾏时异常。这个时候A甚⾄完全没有代码变更就突然失败了,会带来更多的困惑这也是maven经常遭⼈诟病的⼀个因素,对于同⼀份代码,构建结果却不具备确定性,让很多⼈沮丧。当然这个不完全是因为依赖的问题,也有maven插件的问题,maven之前的版本寻找插件策略的⽅式也存在不确定性,maven在版本2的时候,会去寻找最新的插件版本(如果没配置的话)来执⾏构建,经常会找到SNAPSHOT版本的插件,所以依赖了⼀个不稳定的插件来执⾏构建,不确定性就⼤⼤增加。不过maven在3版本就改变了这个策略,会寻找最新稳定版的插件来执⾏构建,使得构建具备了确定性,稳定性也好多了。说明maven本身也在SNAPSHOT的问题上狠狠摔了⼀跤。

归根到底,这些问题的根源就是SNAPSHOT是变化的,是不稳定的,⽽应⽤(软件)依赖于变化并且不稳定的SNAPSHOT的依赖会导致⾃身也在变化和不稳定中,这是稳定性的⼀个⼤忌,依赖不稳定的服务或者依赖,上述的maven2的问题就是⼀个典型反例。

RELEASE简介

RELEASE版本和SNAPSHOT是相对的,⾮SANPSHOT版本即RELEASE版本,RELEASE版本是⼀个稳定的版本号,看清楚咯,是⼀个,不是⼀系列,可以认为RELEASE版本是不可变化的,⼀旦发布,即永远不会变化。

虽然RELEASE版本是稳定不变的,但是仓库还是有策略让这个原则变得可配置,有的仓库会配置成redeploy覆盖,这样RELEASE版本就变成SNAPSHOT了,伪装成RELEASE的SNAPSHOT,会让问题更费解和棘⼿,我⼀般称这类⼈为“挖坑专家”。

记住,RELEASE⼀旦发布,就不可改变。

如何选择

那么什么时候使⽤SNAPSHOT?什么时候使⽤RELEASE?这个可以从他们各⾃的特性上来看,SNAPSHOT版本的库是⼀直在变化的,或者说随时都会变化的,这样虽然可以获取到最新的特性,但是也存在不稳定因素,依赖⼀个不稳定的模块或者库会让模块⾃身也变得不稳定,尤其是⾃身对被依赖模块的变化超出掌控的情况。即使可以掌控被依赖模块的变化,也会带来不稳定的因素,因为每次变更都有引⼊bug的可能性。如果这么说,那么我们是不是要摒弃SANPSHOT了呢?答案肯定是否定的。

想象下,什么情况下,模块会⼀直变化或者变化⽐较剧烈?开发新特性的时候,所以对于团队之间协同开发的时候,模块之间出现依赖,变化会⾮常剧烈,如模块A依赖模块B,模块A必然需要最⽅便地获取模块B的特性,在开发期间,⽅便性⽐稳定性更重要。可以反证下,假设模块B使⽤RELEASE版本1.0.0,模块A依赖1.0.0,现在模块A出现了bug,需要修复下,那么A就要提供⼀个版本号1.0.1,这样所有依赖A模块都需要更新版本号,因为开发期间这种事情是如此多,所以会带来巨变。反观SNAPSHOT⽅案,如果模块B的版本是1.0.0-SNAPSHOT,模块A完全不需要修改版本号即可获取模块B的新特性。当开发进⼊预发布阶段,为了⽣产环境的稳定性,依赖应该是RELEASE版本,因为此时SNAPSHOT版本的模块⾃动获取新特性的特点恰恰会造成⽣产环境的不稳定性,⽣产环境上,稳定性重于⼀切。

现在已经很明确了,在开发期间,活跃模块的版本号使⽤SNAPSHOT,在⽣产期间,依赖RELEASE版本模块。貌似,我们找到了银弹,不过这个只是理想状态,即所有的模块的版本都在⾃⼰的掌控或者间接掌控下,只有这样你才能影响对应模块的版本号。往往是理想很丰满,现实却很⻣感,如果你依赖的⼀个模块只有SNAPSHOT版本,并且该模块也很活跃,最⽆助的是模块的维护⼈不理会你的请求,那么是否就没辙了,只能把应⽤构建在不稳定模块上呢?介绍⼀款maven插件——versions,这是⼀个⾮常强⼤的版本管理插件,其中有个对依赖版本加锁的特性——lock-snapshots,并且提供了参数可以控制锁定的依赖,就可以实现对特定的SNAPSHOT模块锁定版本,执⾏的命令如下:mvn versions:lock-snapshots -DincludesList="groupId:artifactId:type:classier:version",执⾏这个命令之后,对应的版本号会变化,⽐如1.0.0-SNAPSHOT会变成1.0.0.20090327.172306-4,即完成了锁定,此时这个SNAPSHOT就变成了固定⼩版本的稳定版本,不会在变化了,也相当于正式版的功能了。当然以后也可以解锁,详细请看对应⽂档。

二、Nexus的仓库与仓库组

Maven仓库管理器-Nexus_nexus - maven管理器介绍-CSDN博客

Nexus的仓库与仓库组_nexus group-CSDN博客

Nexus(也称Nexus私服)是Maven的仓库管理器,你可以使用Gradle或者Maven,从远程仓库或者本地仓库下载你所需要的构件

Nexus的 仓库类型 主要分为以下四种:

group:  仓库组(用来合并多个hosted/proxy仓库,当你的项目希望在多个repository使用资源
             时就不需要多次引用了,只需要引用一个group即可)
hosted:宿主(通常我们会部署自己的构件到这一类型的仓库。比如公司的第二方库)
proxy:代理代理(它们被用来代理远程的公共仓库,如maven中央仓库。)
virtual:虚拟
 

依赖流程图

Nexus私服的优势

        如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库远程提供了,假如没网了或者出现其他情况,我们怎么办?

        这也就是说我们对中央仓库的依赖性太高了。而搭建一个Nexus服务器相当于我们在我们本地局域网搭建了一个类似中央仓库的服务器,我们可以将中央仓库的一些资料下载到私服务器上,然后平时我们的gradle或maven项目就是直接访问局域网内的私服即可,既节省了网络带宽也会加速项目搭建的进程,这样对我们开发来说,对公司来说都是非常好的选择,而且可以方便对公司内部开发包的管理

宿主类型仓库 

release库:发布内部模块中的releas模块的仓库,用来管理发布版本构建

snapshot库:发布内部模块中snapshot模块的仓库,用来管理快照版本的构建,snapshot意味快照,如果项目版本是snaphost,意味着项目在开发中,还不稳定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1820793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scala网络编程:代理设置与Curl库应用实例

在网络编程的世界里&#xff0c;Scala以其强大的并发模型和函数式编程特性&#xff0c;成为了开发者的得力助手。然而&#xff0c;网络请求往往需要通过代理服务器进行&#xff0c;以满足企业安全策略或访问控制的需求。本文将深入探讨如何在Scala中使用Curl库进行网络编程&…

【AI】文心一言的使用分享

在数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞速发展正在改变我们的生活。文心一言&#xff0c;作为这一浪潮中的佼佼者&#xff0c;以其卓越的自然语言处理能力和广泛的应用场景&#xff0c;给我带来了前所未有的使用体验。在这篇分享中&#xff0c;我…

百万上下文RAG,Agent还能这么玩

❝ 在AI技术飞速发展的今天&#xff0c;我们见证了许多令人惊叹的突破。最近&#xff0c;Qwen2模型的开源引起了广泛的关注&#xff0c;它不仅展示了超越闭源模型的能力&#xff0c;还带来了一个全新的框架——Qwen-Agent。 Qwen-Agent的设计思路虽然与LangChain相似&#xff0…

【光伏科普】走近户用光伏

随着全球对可再生能源和环境保护的日益重视&#xff0c;光伏技术作为一种清洁、可再生的能源形式&#xff0c;受到了广泛的关注和应用。在光伏领域中&#xff0c;户用光伏&#xff08;也称为家庭光伏或屋顶光伏&#xff09;因其灵活性和便捷性&#xff0c;逐渐成为普通家庭实现…

nginx配置https协议(测试环境)

第一步申请证书 首先申请证书这一步&#xff0c;晚上有很多种方式实现&#xff0c;可以自己用算法实现&#xff0c;也可以找在线生成的网站&#xff0c;我这里使用了在线网站 https://www.toolhelper.cn/SSL/SSLGenerate 第二步将证书放到对应的目录下 这里我们主要用cert.pe…

Vue 简单自定义标签

Vue 简单自定义标签 思路&#xff1a; 1、计算每个项离父级左侧宽 left 2、计算当前滑块的宽&#xff0c;绝对定位 3、下一个项的宽/2-滑块的宽/2下一项离父级左侧的宽 left 4、使用定位left&#xff08;性能较差一点&#xff09; 或 translate 移动距离 <template><…

记录pytest中场景执行的token异常处理问题

前言中写了一个conftest钩子函数用于处理重复调用token的方法&#xff0c;http://t.csdnimg.cn/N4rCK&#xff0c;每个用例单独执行都很正常&#xff0c;但是批量执行时一直报错&#xff0c;token缓存处理也不生效。 所有的用例都报获取不到token&#xff0c;方法改了又改&…

一带一路情 相逢《中国缘》-诗琳探访湘西墨戎苗寨交流有感

一带一路情 相逢《中国缘》 诗琳探访湘西墨戎苗寨交流有感 5月21日至25日&#xff0c;《中国缘》栏目组组织的走进湘西苗疆边陲的文化交流活动&#xff0c;在群山环抱、绿树成荫、人文厚重的湘西古丈墨戎苗寨美丽绽放。这场以民间角度推演的中国和中亚人民的文化交流活动&am…

动态规划思想-01背包图解案例

动态规划介绍 动态规划基本思想 ​ 动态规划将一个问题分解为若干个互相重叠的子问题&#xff0c;并通过存储子问题的解来避免重复计算&#xff0c;从而大幅提升时间效率。 ​ 跟分治有些类似&#xff08;“分”与“合”体现在 状态转移方程&#xff09;&#xff0c;但是通常…

区别五大数据可视化工具,有这一篇就够了

进入企业数字化时代&#xff0c;数据可视化工具的重要性被越来越多企业看到。这些企业都希望在短时间内找到适合自己的数据可视化工具。以下是针对帆软BI、奥威BI、思迈特BI&#xff08;Smartbi&#xff09;、永洪BI和亿信华辰BI的详细介绍&#xff0c;希望能帮助用户企业快速筛…

大语言模型 (LLM) 红队测试:提前解决模型漏洞

大型语言模型 (LLM) 的兴起具有变革性&#xff0c;以其在自然语言处理和生成方面具有与人类相似的卓越能力&#xff0c;展现出巨大的潜力。然而&#xff0c;LLM 也被发现存在偏见、提供错误信息或幻觉、生成有害内容&#xff0c;甚至进行欺骗行为的情况。一些备受关注的事件包括…

FL Studio 21.2.2.3914 Win绿色版内置破解补丁和汉化文件,可以完美激活软件

Image-Line FL Studio 21.2.2 x64是一款极受欢迎的音乐制作软件&#xff0c;被广泛用于专业的音乐制作和音频编辑。作为FL Studio系列的最新版本&#xff0c;它在音乐制作界中因其强大的功能、灵活的工作流程和用户友好的界面而备受推崇。 PS.本次为你带来的是fl studio21破解版…

短视频压缩与编码技术在短剧APP小程序开发中的应用:技术选择与工具推荐

在短剧APP小程序开发中&#xff0c;选择合适的短视频压缩与编码技术及工具对于实现高效的视频处理至关重要。本文将探讨如何选择合适的技术和工具&#xff0c;以及推荐一些在实际开发中常用的解决方案。 技术选择的原则 平衡压缩率与视频质量&#xff1a;在选择压缩技术时&…

基于云效 AppStack,5 分钟搞定一个 AI 应用的开发和部署

实验介绍 区别于传统的流水线工具&#xff0c;本实验将带你体验云效应用交付平台 AppStack&#xff0c;从应用视角&#xff0c;完成一个 AI 聊天应用的高效交付。 你将体验到&#xff1a; 基于应用模板快速初始化应用&#xff0c;包含应用的代码库、部署编排架构、变量组、环…

京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设

京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设 京准电钟 NTP时间同步服务器助力水库水坝水利自动化建设 水库大坝监测系统主要包括渗流监测系统、流量监测系统、雨量监测系统、沉降监测系统组成。每一个监测系统由监测仪器及自动化数据采集装置&#xff08;内置通信装…

virtualbox扩展磁盘

使用virtualbox搭建虚拟机&#xff0c;如果磁盘不够用了&#xff0c;可以通过以下方式扩展。 扩容磁盘 分区扩展 查看磁盘情况 fdisk -l Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors Units sectors of 1 * 512 512 bytes Sector size (logical/phys…

HAL库--内存保护(MPU)实验

MPU是内核外设&#xff0c;想获取相关资料只能从内核手册查找 MPU功能仅F7/H7系列具备 内存保护单元(MPU介绍) MPU基本介绍 说白了MPU用来管理内存和外设存储区的访问权限 MPU可配置保护8/16个内存区域(看芯片型号)&#xff0c;每个区域最小要求256字节&#xff0c;且每个区…

【启明智显分享】个位数价格工业HMI芯片:720P@60fps,配备2D加速

我们生活在一个“屏”的时代&#xff0c;工业自动化、智能生活的实现都离不开屏幕的帮助&#xff0c;而对于消费者而言&#xff0c;最大的痛点就是显示屏的画质&#xff0c;一个优质的人机交互界面影响着用户体验&#xff0c;流畅清晰的图像呈现与屏幕的分辨率、刷新率都息息相…

Spring-Cloud-Gateway--源码分析及应用

文章目录 一、简介1.1 术语 1.3 特性1.4 Spring Cloud Gateway与Spring Cloud ZuulSpring Cloud ZuulWebflux模型 1.5 如何集成Gateway 二、工作原理2.2 Gateway类图 三、配置路由谓词工厂和网关过滤工厂3.1 两种不同的配置路由方式通过yml文件来配置通过Java Bean来配置 3.2 R…

vue生命周期及组件讲解(如何导入引用外部vue文件,以及注册全局变量,自定义标签效果)

生命周期钩子的理解与应用 函数说明onBeforeMount( )组件挂载前onMounted( )组件挂载后onBeforeUpdate( )组件更新前onUpdated( )组件中任意的DOM元素更新后onBeforeUnmount( )组件实例被销毁前onUnmounted( )组件实例被销毁后 生命周期在 各类应用以及网站中使用非常广泛&…