【Maven二】——maven仓库

news2024/12/23 22:30:55

系列文章目录

Maven之POM介绍
maven命令上传jar包到nexus


maven仓库

  • 系列文章目录
  • 前言
  • 一、什么是maven仓库?
  • 二、仓库的分类
    • 建立私服的优势
  • 三、远程仓库的配置
  • 四、远程仓库的认证
  • 部署至远程仓库
  • 五、快照版本&why
  • 六、从仓库解析依赖的机制
  • 七、镜像
  • 总结


前言

由于在具体项目开发过程中对于maven的理解和掌握处于基本运用的阶段,了解maven过于片面,所以本篇博客是博主学习《maven实战》书籍之后的总结,绝大多数内容源于《maven》实战这本书籍。


在这里插入图片描述

一、什么是maven仓库?

在maven世界中,任何一个依赖,插件或者项目构建的输出,都可以成为构件。
maven在某个位置统一存储所有Maven项目共享的构建,这个统一的位置就是仓库。
maven项目只需要声明这些依赖的坐标,在需要的时候(如:编译时)maven会自动根据坐标找到仓库中的构件,并使用他们。

为了实现重用,项目构建完毕后生成的构建也可以安装或部署到仓库中,供其他项目使用。

二、仓库的分类

在这里插入图片描述

在maven 中仓库分为两类:本地仓库和远程仓库。
当maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,就直接使用。
如果本地不存在此构件,或者需要查看是否有更新的构建版本,maven就会去远程仓库中寻找,发现需要的构件之后下载到本地仓库之后再使用。
如果本地和远程都没有需要的构建maven就会报错。

一些特殊的远程仓库:中央仓库是maven自带的远程仓库,它包含了绝大部分开源的构建。在默认配置中,当本地仓库没有maven需要的构件的时候,他就会从中央仓库下载。

私服:私服是另一种特殊的远程仓库,为了节省时间和宽带。应该在局域网内架设一个私有的仓库服务器,用于代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。

除了中央仓库和私服,还有很多其他公开的远程仓库,常见的有http://repository.jboss.com/maven2/和我们国内的阿里云仓库。

建立私服的优势

在这里插入图片描述

  1. 节省外网带宽:减少组织自己的开支,大量的对于外部仓库的请求会消耗很大的带宽。
  2. 加速maven构件。不停的请求外部仓库十分耗时,使用私服之后,maven只需要检查局域网内私服的数据,构建速度能得到很大程度的提升。
  3. 部署第三方构件。当某个构件无法从任何一个外部仓库获得。如组织自行开发的构建或其他。建立私服之后,便可以将这些构件部署到私服上,共内部的maven项目使用。
  4. 提高稳定性,增强控制。maven构建高度依赖与远程仓库。因此当Internet不稳定是,maven构建也会变得不稳定,使用私服之后,及时暂时没有internet连接,由于私服中已经缓存了大量构建,maven也能正常运行。
  5. 降低中央仓库的负荷。

三、远程仓库的配置

在很多情况下,默认的中央仓库无法满足项目的需求,可能项目需要的构件存在于另外一个远程仓库,如JBoss Maven仓库。
这是我们可以在POM中配置该仓库
如:
在这里插入图片描述
在repositories元素下,可以使用repository子元素声明一个或者多个远程仓库。
该示例中声明了一个id为Jboss,名称为JBoss Repository仓库。
任何一个仓库声明的id必须是唯一的,需要注意的是Maven自带的中央仓库使用的id为central,
如果有其他仓库声明也使用了该id,则会覆盖中央仓库的配置。
上述示例的配置中的releases和snapshots他们是用来控制maven对于发布版构件和快照版构件的下载。
这里需要注意的是enabled子元素,该示例中releases的enabled的值为true,表示开启JBoss仓库的发布版本下载支持,
而snapshots的enabled值为false,表示关闭了JBoss仓库的快照版本的下载支持。
因此,在该配置下maven只会从JBoss仓库下载发布版的构件,而不会下载快照版的构件。
该示例中的layout元素值default表示仓库的布局是maven2及maven3的默认布局,而不是maven1的布局。

对于releases和snapshots来说,除了enabled,他们还有另外两个子元素updatePolicy和checksumPolicy
在这里插入图片描述
元素updatePolicy用来配置maven从远程仓库检查更新的频率,默认的值为daily,表示maven每天检查一次,其他值包括:never——从不检查更新;always——每次构建都检查更新;X——每隔X分钟检查一次更新(X为任意整数)。

元素checksumPolicy用来配置Maven检查验证和文件的策略。当构件被部署到maven仓库中时,会同时部署读音的校验和文件。在下载构件的时候,maven会验证校验和文件。
如果校验和验证失败,当checksumPolicy的值为默认的warn时,maven会在执行构件时输出警告信息,其他值包括:fail——maven遇到校验和错误就让构件失败;ignore——使maven完全忽略校验和错误。

四、远程仓库的认证

大部分远程仓库无须认证就可以访问,但是有时候出于安全方面的考虑,我们需要提供认证信息才能访问。例如:组织内部有一个maven仓库,该服务器为每个项目都提供了独立的maven仓库,我了防止非法的仓库访问,管理员为每个仓库提供了一组用户名和密码。
这种情况下,为了能够访问远程仓库,就需要配置认证信息。

配置认证信息与配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须配置在settings.xml文件中。
这是因为POM往往是被提交到代码仓库中供所有成员访问,而settings.xml一般放在本机,因此settings.xml中配置认证信息更为安全。

例如:需要为一个id为my-proj的仓库配置认证信息,编辑settings.xml文件如下:
在这里插入图片描述
使用servers元素和server子元素配置仓库的认证信息。
注意settings.xml中的id必须与POM中需要认证的repository元素的id完全一致。
这里的id将认证信息与仓库配置联系在一起。

部署至远程仓库

私服的一大作用是部署第三方构件,包括组织内部生成的构建以及一些无法从外部仓库直接获取的构建。无论是日常
开发中生成的构建,还是正式版本发布的构建,都需要部署到仓库中,供其他团队成员使用。
在这里插入图片描述
distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本构建的仓库,
后者表示快照版本的仓库。这两个元素下都需要配置id、name和url,id为该远程仓库的唯一标识,那么是为了便于阅读,
url表示该仓库的地址。

往远程仓库部署构建的时候,一般都需要认证,就需要上面讲的在settings.xml文件中配置远程仓库的认证。

配置之后在命令行运行mvn clean deploy,maven就会将项目构建输出的构建部署到对应的远程仓库,如果项目当前的版本是快照版本,则部署到快照版本仓库地址。
否则就部署到发布版本仓库地址。

五、快照版本&why

在maven的世界中,任何一个项目或者构件都必须有自己的版本,版本的值可能是1.0.0、1.3-alpha-4、2.0、2.1-SNAPSHOT或者2.1-20230711.221414-13.
其中1.0.0、1.3-alpha-4、2.0都是稳定的发布版本,2.1-SNAPSHOT或者2.1-20230711.221414-13是不稳定的快照版本。

**maven为什么要区分发布版本和快照版本呢?**试想一下这样的情况,张三在开发模块A的2.1版本,该版本还未正式发布,与模块A一同开发的还有模块B
它有李四开发,B的功能依赖于A。在开发的过程中,张三需要经常将自己最新的构建输出,交给李四,通他开发和测试,那么这个工作如何进行呢?

在整个开发过程中,会不定更新版本2.1.1、2.1.2、2.1.3…,那么张三和李四都需要频繁的更新POM,如果有更多的模块依赖模块A,就会涉及到更多的POM更改,其次,大量的版本其实仅仅包含了微小的差异。有时候就是对版本号的滥用。

maven的快照版本就是为了解决上述的问题。在上面的场景中,张三只需要将模块A的版本设定为2.1-SNAPSHOT,然后发布到私服中,在发布的过程中,maven会自动为构建打上时间戳。比如2.1-20230711.2213414-13就表示2023年7月11日22点14分14秒的第13次快照。有了该时间戳,maven就能随时找到仓库中该构建2.1-SNAPSHOT版本最新的文件。
这是李四对于模块A的2.1-SNAPSHOT版本的依赖,当他构建模块B的时候,maven会自动从仓库中检查模块A的2.1-SNAPSHOT的最新构建,当发现有更新时边进行下载。
默认情况下,Maven每天检查一次更新,用户也可以使用命令行-U参数强制让maven检查更新,如mvn clean install-U。

当项目经过完善的测试后需要发布的时候,就应该将快照版本更改为发布版本。例如将2.1-SNAPSHOT更改为2.1,表示该版本已经稳定,且只对应了唯一的构件。

六、从仓库解析依赖的机制

  1. 当依赖的范围是system的时候,maven直接从本地文件系统解析构件。
  2. 根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件则解析成功。
  3. 在本地仓库不存在相应构件的情况下,如果依赖的版本是显示的发布版本构件,如1.2、2.10bata-1等,则遍历所有的远程仓库,发现之后,下载并解析使用。
  4. 如果依赖版本是SNAPSHOT如1.2-SNAPSHOT,则基于更新策略读取所有远程的元数据groupId/artifactId/version/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后基于该值检查本地仓库或者从远程仓库下载。
  5. 如果最后解析得到的构建版本是时间戳格式的快照,如1.4.1-20231104.12.1414-121,则复制其时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用该非时间戳格式的构建。

七、镜像

如果仓库库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。也就是任何一个可以从仓库Y获得的构件,都能够从它的镜像中获取。
例如:http://maven.net/cn/content/groups/public是中央仓库http://repol.maven.org/maven2/在中国的镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的服务。
因此可以配置maven使用该镜像来代替中央仓库,编辑settins.xml文件
如:
在这里插入图片描述
上面的示例中的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,用户也可以使用同样的配置其他仓库的镜像。
如果该镜像需要认证,也可以基于该id配置仓库认证。

关于镜像的更为常见的用法是结合私服。由于私服可以代理任何外部的公共仓库(包括中央仓库)因此,对于组织内部的maven用户来说,使用一个私服地址就等于使用所有需要的外部仓库,这可以将配置集中到私服,从而简化maven本身的配置。
在这里插入图片描述

上面的示例中,的值为星号,表示该配置是所有Maven仓库的镜像,任何对于远程的请求都会被转至http://192.168.1.100/maven2/。如果该仓库需要认证,这需要配置一个id为internal-repository的.

maven还支持更高级的镜像配置。
匹配所有远程仓库
external:</mirrorOf匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是匹配所有不在本机上的远程仓库。
repo1,repo2匹配仓库repo1和repo2,使用逗号分隔多个远程仓库
*,! repo1匹配所有与远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。

总结

本篇博客主要是讲解的maven仓库的内容,通过本篇博客对仓库的思维导图,以及本篇博客的具体内容,能够对maven仓库有一个更为全面的理解。并且在具体项目开发过程中也能够十分明确maven仓库有什么、maven仓库是什么。

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

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

相关文章

习题—实用类

目录 1.xxx 1.包装类及其构造方法 import java.util.List; import java.util.ArrayList; import java.util.Scanner;//包装类及其构造方法 public class Test {public static void main(String[] args) {// 装箱&#xff1a;基本类型转换为包装类的对象 // 拆箱&#xff1a…

go mod verdor简明介绍

Go 语言在 go 1.6 版本以后编译 go 代码会优先从 vendor 目录先寻找依赖包&#xff0c;它具有以下优点&#xff1a; 复制依赖&#xff1a;go mod vendor 会把程序所依赖的所有包复制到项目目录下的vendor 文件夹中&#xff0c;所以即使这些依赖包在外部源&#xff08;如 GitHu…

「C/C++」C/C++宏定义#define

✨博客主页&#xff1a;何曾参静谧的博客 &#x1f4cc;文章专栏&#xff1a;「C/C」C/C程序设计 目录 术语说明宏定义 #define定义常量定义函数定义代码块常用标识符用宏包含头文件 术语说明 定义宏是一种预处理器指令&#xff0c;它可以将一些代码片段或者常量直接替换为另一…

刘二大人Pytorch课程笔记

Lecture01. Overview 没啥好记的&#xff0c;理解就好 人工智能和机器学习等的关系&#xff1a; 正向传播 正向传播本质上是按照输入层到输出层的顺序&#xff0c;求解并保存网络中的中间变量本身。 反向传播 反向传播本质上是按照输出层到输入层的顺序&#xff0c;求解并…

LangChain 联合创始人下场揭秘:如何用 LangChain 和向量数据库搞定语义搜索?

近期&#xff0c;关于 ChatGPT 的访问量有所下降的消息引发激烈讨论&#xff0c;不过这并不意味着开发者对于 AIGC 的热情有所减弱&#xff0c;例如素有【2023 最潮大语言模型 Web 开发框架】之称的大网红 LangChain 的热度就只增不减。 原因在于 LangChain 作为大模型能力“B2…

1快速入门MyBatis

开发前的准备 准备数据库表&#xff1a;汽⻋表t_car 确定表中的字段以及字段的数据类型 guide_price是decimal类型&#xff0c;专⻔为财务数据准备的类型produce_time可以用char类型 , 格式’2022-10-11’ 使用navicat for mysql⼯具向t_car表中插⼊两条数据 配置IDEA中ma…

【C++修炼之路】vector 模拟实现

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、读源码二、成员变量三、默认成员函数1、构造2、析构3、拷贝构造4、赋值重载 四、访问1、[ ] 重载2、迭代器 五、容量1、cap…

Profibus DP主站转Modbus TCP网关profibus从站地址范围

远创智控YC-DPM-TCP网关。这款产品在Profibus总线侧实现了主站功能&#xff0c;在以太网侧实现了ModbusTcp服务器功能&#xff0c;为我们的工业自动化网络带来了全新的可能。 远创智控YC-DPM-TCP网关是如何实现这些功能的呢&#xff1f;首先&#xff0c;让我们来看看它的Profib…

Oracle解析JSON字符串

Oracle解析JSON字符串 假设某个字段存储的JSON字符串&#xff0c;我们不想查出来后通过一些常见的编程语言处理&#xff08;JSON.parse()或者是JSONObject.parseObject()等&#xff09;&#xff0c;想直接在数据库上处理&#xff0c;又该如何书写呢&#xff1f; 其实在ORACLE中…

算法06-搜索算法-广度优先搜索

文章目录 参考&#xff1a;总结大纲要求搜索算法-广度优先搜索迷宫问题问题迷宫的存储迷宫的移动搜索方式代码实现 图的广度优先遍历题目描述用邻接矩阵表示图 搜索算法-广度优先搜索 参考&#xff1a; 【算法设计】用C类和队列实现图搜索的广度优先遍历算法 C/C 之 广度优先…

梯度下降(Gradient Descent)

基本思想 梯度下降是一个用来求函数最小值的算法&#xff0c;本次&#xff0c;我们将使用梯度下降算法来求出代价函数的最小值。 梯度下降背后的思想是&#xff1a;开始时我们随机选择一个参数的组合&#xff0c;计算代价函数&#xff0c;然后我们寻找下一个能让代价函数值下降…

Linux:squid透明代理

在传统代理上进行修改并添加网卡 这次不使用手动代理&#xff0c;而是把网关搞成代理 在下面这个链接里的文章实验下进行修改 Linux&#xff1a;squid传统代理_鲍海超-GNUBHCkalitarro的博客-CSDN博客 完成以后不用再win10上去配置&#xff0c;代理的那一步&#xff0c;然后…

Python(十二)常见的数据类型

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

TabLayout+ViewPager实现滚动页面

目录 一、TabLayout介绍 二、TabLayout的常用属性和方法 常用属性&#xff1a; 常用方法&#xff1a; 三、适配器介绍 &#xff08;一&#xff09;、PagerAdapter介绍&#xff1a; &#xff08;二&#xff09;、FragmentPagerAdapter介绍&#xff1a; &#xff08;三&am…

习题 1.26

我们先来看看题目要求&#xff0c;题目住说将 square 调用换成了&#xff08;* x x),结果导致执行时间变慢。 根据以前学过的内容&#xff0c;我们知道 在做显示乘法的时候&#xff0c;是直接进行计算的&#xff0c;而在做函数调用的时候&#xff0c;是先进行表达式展开的&…

【MySQL】常见函数使用(二)

&#x1f697;MySQL学习第二站~ &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 ❤️文末附全文思维导图&#xff0c;感谢各位点赞收藏支持~ 就如同许多编程语言中的API一样&#xff0c;MySQL中的函数同样是官方给我们封装好的&#xff0c;可以直接调用的一段代码。…

ZooKeeper ZAB

文章首发地址 在接收到一个写请求操作后&#xff0c;追随者会将请求转发给群首&#xff0c;群首将探索性地执行该请求&#xff0c;并将执行结果以事务的方式对状态更新进行广播。一个事务中包含服务器需要执行变更的确切操作&#xff0c;当事务提交时&#xff0c;服务器就会将这…

dp算法篇Day7

"抱紧你的我&#xff0c;比国王富有~" 31、最长定差子序列 (1) 题目解析 从题目来看还是很容易理解的&#xff0c;就是找寻数组中构成差值相等的子序列。 (2) 算法原理 class Solution { public:int longestSubsequence(vector<int>& arr, int difference…

多模态系列论文--ALBEF 详细解析

ALBEF来自于Align before Fuse&#xff0c;作者团队全自来自于Salesforce Research。 论文地址&#xff1a;Align before Fuse: Vision and Language Representation Learning with Momentum Distillation 论文代码&#xff1a;ALBEF 1 摘要 最近图像文本的大规模的特征学习非…

AI Chat 设计模式:7. 单例模式

本文是该系列的第七篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的旁白和思考。 问题列表 Q.1 简单介绍一下单例模式A.1Q.2 详细说说饿汉式&#xff0c;并使用 c 举例A.2Q.3 好&#xff…