MAVEN-SNAPSHOT和RELEASE + 打包到远程仓库

一、快照版本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,意味着项目在开发中,还不稳定

三、打包到远程仓库:

distributionManagement 分发构件到远程仓库

mvn install 会将项目生成的构件安装到本地Maven仓库,mvn deploy 用来将项目生成的构件分发到远程Maven仓库。

本地Maven仓库的构件只能供当前用户使用,在分发到远程Maven仓库之后,所有能访问该仓库的用户都能使用你的构件。

我们需要配置POM的来指定Maven分发构件的位置,

如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

<!-- 定义snapshots库和releases库的nexus地址 -->

<distributionManagement>

    <repository>

        <!-- 库的id -->

        <id>nexus-releases</id>

        <!-- 库的url -->

        <url>https://172.17.103.59:8081/nexus/content/repositories/releases/</url>

    </repository>

    <snapshotRepository>

        <id>nexus-snapshots</id>

        <url>https://172.17.103.59:8081/nexus/content/repositories/snapshots/</url>

    </snapshotRepository>

</distributionManagement>

maven的pom.xml中repositories和distributionManagement使用_java_脚本之家

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[面试题]Kafka

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

git merge(3个模式) 与 git rebase 图文详解区别

目录 1 git merge1.1 模式一&#xff1a;fast-forward(–ff)1.2 模式二&#xff1a;non-Fast-forward(–no-ff)1.3 模式三&#xff1a;fast-forward only(–ff-only) 2 git rebase3 区别 1 git merge git merge有好几种不同的模式 默认情况下你直接使用 git merge 命令&#x…

怎么还有人不清楚H3C认证考试流程?给你整理得明明白白

最近不少人都在后台问H3CIE资格认证考试&#xff08;全称&#xff1a;H3C认证路由交换互联网络专家&#xff09;&#xff0c;今天咱们就来聊一聊这个考试流程。第一次报考H3CIE-RS的考生需先参加新华三人才研学中心认可的H3CIE-RS认证培训。 H3C授权培训中心可在新华三官网查询…

迅为RK3568驱动教程第十八期-PWM

系统性PWM课程&#xff0c;完全掌握PWM。采用框架学习法&#xff0c;从基础知识、PWM子系统框架、API函数理论由面到点&#xff0c;逐个击破。通过SG90舵机&#xff0c;呼吸灯的控制把理论转为动手能力。最后从零实现输入捕获驱动程序&#xff0c;深入探究&#xff0c;体验一把…

Python爬虫小白入门(四)PhatomJS+Selenium篇下

一、前言 前文介绍了PhatomJS 和Selenium 的用法&#xff0c;工具准备完毕&#xff0c;我们来看看如何使用它们来改造我们之前写的小爬虫。 我们的目的是模拟页面下拉到底部&#xff0c;然后页面会刷出新的内容&#xff0c;每次会加载10张新图片。 大体思路是&#xff0c;用S…

list的特性及使用

1、list的介绍 1.list是序列容器&#xff0c;允许在序列的任何位置进行时间复杂度为o(1)的插入和删除操作&#xff0c;并且由双向迭代器。 2.list的底层是双链表&#xff0c;双链表不是物理上连续的储存空间&#xff0c;而是不同的地址空间通过next和prev指针连接成顺序表。 …

【每天学会一个渗透测试工具】AppScan安装及使用指南

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 https://www.hcl-software.com/appscan AppScan是一种综合型漏洞扫描工具&#xff0c;采用SaaS解决方案&#xff0c;它将所以…

【Tello无人机】使用Matlab完成控制器的设计—建模

模型辨识篇 在实际的无人机系统中&#xff0c;控制器的设计至关重要&#xff0c;它直接影响无人机的稳定性和响应能力。然而&#xff0c;要设计出高效、可靠的控制器&#xff0c;首先必须准确理解无人机的动态行为&#xff0c;这就需要通过收集输入输出数据来辨识其运动学模型。…

天池人脸识别项目复现

1 项目背景 #c 概述 项目的目的 图像分类是整个计算机视觉领域中最基础的任务&#xff0c;也是最重要的任务之⼀&#xff0c;最适合拿来进⾏学习实践。为了让新⼿们能够⼀次性体验⼀个⼯业级别的图像分类任务的完整流程&#xff0c;本次我们选择带领⼤家完成⼀个对图片中⼈脸进…

从0开始C++(二):类、对象、封装

目录 类&对象的概念 类的内容 对象的创建 ● 栈内存对象 ● 堆内存对象 封装 类&对象的概念 类和对象是一个比较抽象的概念&#xff0c;这里直接用一个实例方便理解。 类&#xff1a;类是一个抽象的概念&#xff0c;用来描述同一类对象的特点&#xff08;比如&am…

从零开始如何学习人工智能?

说说我自己的情况&#xff1a;我接触AI的时候&#xff0c;是在研一。那个时候AlphaGo战胜围棋世界冠军李世石是大新闻&#xff0c;人工智能第一次出现我面前&#xff0c;当时就想搞清楚背后的原理以及这些技术有什么作用。 就开始找资料&#xff0c;看视频。随着了解的深入&am…

第 三 方 组 件 e l e m e n t - u i[Vue]

一、组件之间的传值 组件可以由内部的Data提供数据&#xff0c;也可以由父组件通过prop的方式传值。 兄弟组件之间可以通过Vuex等统一数据源提供数据共享 第一种 Movie.vue <template><div><h1>我才不要和你做朋友</h1></div></template&…

怎么为自己的VPS选择合适的CPU和RAM?

为网站选择VPS&#xff08;虚拟专用服务器&#xff09;与为家庭或办公室选择台式机或笔记本电脑没有什么不同。基本上&#xff0c;您要做的就是查看硬件配置并比较功能和价格。 然而&#xff0c;虽然您可能对个人计算机所需的资源类型有一个粗略的估计&#xff0c;但为服务器获…

API接口测试要注意什么?API接口如何开发?

API接口怎么保证数据安全&#xff1f;如何安全调用邮件API接口&#xff1f; API接口不仅能够确保系统的稳定性和可靠性&#xff0c;还能提高开发效率和用户满意度。然而&#xff0c;要进行有效的API接口测试&#xff0c;需要注意多个方面。AokSend将介绍一些关键点&#xff0c…

全面赋能,永久免费!讯飞星火API能力正式免费开放

2023年5月&#xff0c;讯飞星火正式发布&#xff0c;迅速成为千万用户获取知识、学习知识的“超级助手”&#xff0c;成为解放生产力、释放想象力的“超级杠杆”。 2024年5月&#xff0c;讯飞星火API能力正式免费开放&#xff0c;携手生态开发者加快大模型赋能刚需场景。 领…

【软件工程】【22.10】p1

关键字&#xff1a; 软件需求分类、性能需求、数据流图加工、用例关系、捕获系统功能用例、RUP设计层术语、故障、调试、集成测试、需求分析过程、CMMI实践部件、CMMI能力等级 软件需求规约基本性质、模块控制、协作、UML结点、事件、RUP体系结构、RUP移交、静态评估技术、测…

Java共享台球室无人系统支持微信小程序+微信公众号

共享台球室无人系统 &#x1f3b1; 创新台球体验 近年来&#xff0c;共享经济如火如荼&#xff0c;从共享单车到共享汽车&#xff0c;无一不改变着我们的生活方式。而如今&#xff0c;这一模式已经渗透到了更多领域&#xff0c;共享台球室便是其中之一。不同于传统的台球室&a…

DOPE-FITC在细胞定位、动态追踪等方面的应用-星戈瑞

DOPE-FITC作为一种荧光标记磷脂&#xff0c;在细胞生物学研究中发挥着科研作用。其荧光特性和与细胞膜的亲和性&#xff0c;使其成为细胞定位、动态追踪等方面的工具。 细胞定位 DOPE-FITC能够有效地标记细胞膜&#xff0c;使得细胞膜在荧光显微镜下呈现出明亮的绿色荧光。这种…

triton矩阵乘以及缓存优化

这里triton.cdiv(M, META[BLOCK_SIZE_M]) * triton.cdiv(N, META[BLOCK_SIZE_N])&#xff0c;所以grid的形状是一维的。 观察函数内部 pid tl.program_id(axis0)&#xff0c;因为grid是一维的&#xff0c;所以这里就是总块数&#xff0c;我们假设实际A*BC&#xff0c; A&…

ubuntu链接mysql

C链接mysql 报错 sudo apt-get update sudo apt-get install libmysqlclient-dev 指令编译 g -o mysql_example mysql_example.cpp -I/usr/include/mysql -lmysqlclient g mysql_test.cpp mysql_config --cflags --libs 安装mysql sudo apt updatesudo apt install mysql-…