史上最详细的maven仓库详解

2023-11-16

写在前面:

我是「沸羊羊_」,昵称来自于姓名的缩写 fyy ,之前呕心沥血经营的博客因手残意外注销,现经营此账号。
本人是个小菜,正向着全栈工程师的方向努力着,文章可能并不高产,也很基础,但每写一篇都在用心总结,请大佬勿喷。
如果您对编程有兴趣,请关注我的动态,一起学习研究。
感谢每位读者!

1 概述

在 Maven 的术语中,仓库是一个位置(place)。
Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。
在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。
Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。


2 解读Jar在仓库中的存储路径

1、基于 groupId 准备路径,将点分隔符转换成路径分隔符,就是将 “.” 转换成 “/”;例如:org.mybatis --> org/mybatis

2、基于 artifactId 准备路径,将 aftifactId 连接到 groupId 后面,org/mybatis/mybatis-spring

3、基于version 准备路径,将 version 连接到 artifactId 后面,org/mybatis/mybatis-spring/2.0.2

4、连接 artifactId 和 version 以分隔符分隔,org/mybatis/mybatis-spring/2.0.2/mybatis-spring-2.0.2

5、判断如果构件有 classifier,就要在第4项后增加分隔连字号 再加上 classifer,org/mybatis/mybatis-spring/2.0.2/mybatis-spring-2.0.2/mybatis-spring-2.0.2-jdk8

6、检查构件的 extension,如果 extension 存在,则加上句点分隔符和extension,而 extension 是由 packing 决定的,
org/mybatis/mybatis-spring/2.0.2/mybatis-spring-2.0.2/mybatis-spring-2.0.2-jdk8.jar

TIPS

classifier可以是任意的字符串,用于拼接在 gav 之后来确定指定的文件,可用来区分不同jdk版本生成的 jar包。当使用gav出错时,可以查看一下仓库中的jar路径,查看 jar 是否是按 jdk 版本进行划分导致找不到依赖,如果是,在pom中对应的依赖节点gav后添加 classifier 标签。


3 maven仓库

maven仓库类型

3.1 本地仓库

顾名思义,存放在本地磁盘的maven仓库

maven 的本地仓库,在安装 maven 后并不会创建,是在第一次执行 maven 命令的时候才被创建

maven本地仓库默认位置:无论是 Windows 还是 Linux ,在用户的目录下都有一个 .m2/repository/的仓库目录,如何更改 maven 默认的本地仓库位置?在maven 的 settings.xml 文件中使用 <localRepository> 标签进行配置

在这里插入图片描述

此时,maven 的本地仓库地址就会变成自己配置的地址,注:此时配置的 maven 的本地仓库是属于用户范围的。一般情况下不推荐全局范围的本地仓库,用户范围的本地仓库就可以了。

3.2 远程仓库

3.2.1 私服

私服是一种特殊的远程仓库,是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 maven 用户使用。当 maven 需要下载构件的时候,会从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上后,再为 maven 的下载请求提供服务。

maven私服特性

  • 节省外网宽带,:减少重复请求造成的外网带宽消耗
  • 加速 maven 构件:如项目中配置很多外部远程仓库时,构建速度会大大降低
  • 部署第三方构件:有些构件无法从外部仓库获得时,可以把这些构件部署到内部仓库(私服)中,供内部 maven 项目使用
  • 提高稳定性,增强控制:Internet 不稳定时,maven 构建也会很不稳定
  • 降低中央仓库的负荷:maven 中央仓库被请求的数量是巨大的,配置私服可以大大降低中央仓库的压力

主流的maven私服

  • Apache 的 Archiva
  • JForg 的 Artifactory
  • Sonatype 的 Nexus
3.2.2 中央仓库

maven默认中央仓库:

中央仓库由maven社区管理,包含了大量常用的库,流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。

所有的 maven 项目都会继承超级pom超级pom结构如下:

<repositories>  
    <repository>  
      <id>central</id>  
      <name>Central Repository</name>  
      <url>http://repo.maven.apache.org/maven2</url>  
      <layout>default</layout>  
      <snapshots>  
        <enabled>false</enabled>  
      </snapshots>  
    </repository>  
</repositories>

特点:

  • 仓库由maven社区管理;
  • 不需要配置
  • 需要网络才能访问
  • 国内下载速度慢


4 远程仓库配置

由于默认的官方 maven 仓库在国内下载速度太慢,好在有一些镜像仓库,下载速度会快很多!在平时的开发中,我们往往不会使用默认的中央仓库,不仅是速度慢,可能项目的某些构件中央仓库是没有的,而其他远程仓库中有,如最常用的是 阿里云仓库。

<!-- 阿里云仓库 -->
<mirrors>
	<mirror>
	   <id>alimaven</id>
	   <mirrorOf>central</mirrorOf>
	   <name>aliyun maven</name>
	   <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
	</mirror>
</mirrors>

<!-- 私服 -->
<mirrors>
	<mirror>
		<id>nexus</id>
		<mirrorOf>central</mirrorOf>
		<name>nexus repository</name>
		<url>http://nexus.dmsd.tech/nexus/content/groups/dynamic-public</url>
	</mirror> 
</mirrors>

<profile>
<id>central</id>
	<repositories>
		<repository>
			<id>central</id>
			<name>Central</name>
			<url>http://nexus.dmsd.tech/nexus/content/groups/dynamic-public </url>
		</repository>
	</repositories>
</profile> 

mirrors 与 respository

如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都能从它的镜像中获取。例如:

http://repo1.maven.org/maven2/  是中央仓库,
http://maven.oschina.net/content/groups/public/ 是其在中国的镜像,
由于地理位置的因素,该镜像往往能提供比中央仓库更快的服务。因此,可以配置 maven 使用该镜像来替代中央仓库。

<mirrors>
     <mirror>
       <id>maven.oschina.net</id>
       <name>maven mirror in China</name>
      <url>http://maven.oschina.net/content/groups/public/</url>
       <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

其中,mirrorOf的值是 central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像,
用户也可以使用同样的方法配置其他仓库的镜像,id 表示镜像的唯一标识符,name 表示镜像的名称,url 表示镜像的地址。


关于镜像的一个更为常见的用法是结合私服,由于私服可以代理任何外部的远程仓库(包括中央仓库),因此,对于组织内部的maven用户来说 
使用一个私服地址就等于使用了所有需要的外部仓库,这可以将配置集中到私服,从而简化maven本身的配置。在这种情况下,
任何需要的构件都可以从私服中获得,私服就是所有仓库的镜像,这时,可以这样配置:

<!--配置私服镜像-->
 <mirrors> 
     <mirror>  
         <id>nexus</id>  
         <name>internal nexus repository</name>  
         <url>http://183.238.2.182:8081/nexus/content/groups/public/</url>  
        <mirrorOf>*</mirrorOf>  
   </mirror>  
</mirrors>

该例中<mirrorOf>的值为星号,表示该配置是所有Maven仓库的镜像,任何对于远程仓库的请求都会被转至局域网的 url地址,如果该镜像
需要认证,则配置一个 id 为 nexus 的认证信息即可。

如果 repositories 的 id 和 mirror 的 mirrorOf 的值相同,则该mirror 替代该 repository.
如果该 repository 找不到对应的 mirror,则使用其本身,所以起到最终作用的是 repository 集合,repositories 中默认
包含了中央仓库 central,当然也可以重写URL

mirror相当于一个拦截器,它会拦截 maven 对 repository 的相关请求,把请求里的 remote repository 地址,重定向到
mirror 里配置的地址。

5 maven依赖搜索顺序

maven 多仓库查询依赖的顺序大致如下:

  1. 在本地仓库寻找,如果没有则进入下一步
  2. 在全局配置的私服仓库 (settings.xml) 中寻找,如果没有则下一步
  3. 在项目自身配置的私服仓库 (pom.xml) 中寻找,如没有则下一步
  4. 在中央仓库中寻找,如果没有则终止寻找

在这里插入图片描述
注:

1、如果在找寻的过程中,如果发现该仓库有镜像设置,则用镜像的地址代替,例如现在进行到要在respository A仓库中查找某个依赖,但A仓库配置了mirror,则会转到从A的mirror中查找该依赖,不会再从A中查找。

2、settings.xml中配置的profile(激活的)下的respository优先级高于项目中pom文件配置的respository。

3、如果仓库的id设置成“central”,则该仓库会覆盖maven默认的中央仓库配置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

史上最详细的maven仓库详解 的相关文章

随机推荐

  • 推荐工具url

    https www processon com diagrams 很好的web画图工具 https www tapd cn letters from top nav worktable v2 产品 研发 测试工具
  • uboot环境变量的讲解

    1 环境变量的作用域和全局变量相同 环境变量的生命周期为一旦设置好环境变量并保存好后 下次开机还存在 而全局变量在关机后就灭亡了 下次开机产生了一个新的全局变量 2 环境变量如何参与程序运行 1 环境变量有2份 分别在Flash和DDR中
  • hadoop3.3.1单机版环境搭建详细流程记录

    1 在centos7中创建必要的目录 2 上传JDK安装包到tools目录 3 解压JDK到 opt server 目录 tar zxvf jdk 8u221 linux x64 tar gz C opt server 4 vim 未找到命
  • 视音频编解码技术零基础学习方法

    一直想把视音频编解码技术做一个简单的总结 可是苦于时间不充裕 一直没能完成 今天有着很大的空闲 终于可以总结一个有关视音频技术的入门教程 可以方便更多的人学习从零开始学习视音频技术 需要注意的是 本文所说的视音频技术 指的是理论层面的视音频
  • Python-Jenkins 在 Jenkins 中的应用

    Author rab Python 版本 3 9 Jenkins 版本 2 409 官方文档 https python jenkins readthedocs io en latest 目录 前言 一 案例 1 1 管理 Jenkins V
  • Java远程调试(Remote Debug)方法

    Java远程调试的原理是两个VM之间通过debug协议进行通信 然后以达到远程调试的目的 两者之间可以通过socket进行通信 首先被debug程序的虚拟机在启动时要开启debug模式 启动debug监听程序 jdwp是Java Debug
  • 简易的打包器--webpack打包原理

    手写一个简单的类似webpack的打包器 打包流程说明 定义依赖分析函数 通过读取文件内容 分析得到该文件导入的依赖项 code gt AST gt 得到导入声明 记录导入声明中的依赖项路径 gt AST gt code gt 返回记录当前
  • 扫描局域网内所有电脑的端口

    扫描局域网内所有电脑端口可以使用工具如Nmap来完成 Nmap是一个开源的网络探测工具 可以用来扫描端口 识别操作系统 检测服务和插件等 使用Nmap扫描局域网内所有电脑端口的命令如下 nmap sP 192 168 1 0 24 其中19
  • kvm直通sata_PVE 中 对 KVM虚拟机的USB设备设置为直通

    Proxmox支持将USB设备直接映射给KVM虚拟机使用 也就是所谓的USB Passthrough 配置步骤可以参考Proxmox wiki上的有关说明 具体地址是https pve proxmox com wiki USB physic
  • Java随机数

    1 指定数字范围 package com jiayou peis official account biz utils import java util Random public class Test public static void
  • Python模拟登陆万能法-微博

    Python模拟登陆让不少人伤透脑筋 今天奉上一种万能登陆方法 你无须精通HTML 甚至也无须精通Python 但却能让你成功的进行模拟登陆 本文讲的是登陆所有网站的一种方法 并不局限于微博与知乎 仅用其作为例子来讲解 用到的库有 sele
  • ubuntu使用教程与常用命令

    ubuntu使用教程 一 Ubuntu简介 Ubuntu 乌班图 是一个基于Debian的以桌面应用为主的Linux操作系统 据说其名称来自非洲南部祖鲁语或科萨语的 ubuntu 一词 意思是 人性 我的存在是因为大家的存在 是非洲传统的一
  • pdf.js详细解析

    pdf js可以实现在html下直接浏览pdf文档 是一款开源的pdf文档读取解析插件 pdf js主要包含两个库文件 一个pdf js和一个pdf worker js 一个负责API解析 一个负责核心解析 pdf js可通过pdf文件的地
  • 神奇的tmux

    一 Tmux 是什么 1 1 会话与进程 命令行的典型使用方式是 打开一个终端窗口 terminal window 以下简称 窗口 在里面输入命令 用户与计算机的这种临时的交互 称为一次 会话 session 会话的一个重要特点是 窗口与其
  • STM32+4G模块实战项目(连接阿里云物联网平台+OTA升级):(一)初识硬件

    STM32 4G模块实战项目 OTA升级 构思占坑中ing 3天一章 请耐心等待 STM32 4G模块实战项目 连接阿里云物联网平台 OTA升级 一 初识硬件 STM32 4G模块实战项目 连接阿里云物联网平台 OTA升级 二 stm32通
  • @RefreshScope刷新配置文件原理

    一 前置知识 在Spring中bean的作用域 scope 常用的有两种 单例 singleton 原型 prototype Bean的Scope影响了Bean的管理方式 例如创建Scope singleton的Bean时 IOC会将这些B
  • android Http通信(访问web server)

    下面将3种实现方式 以下代码有的来源于传智播客 有的自己琢磨的 在这感谢传智播客 本人开发使用的android studio 在最新版本中 android不在支持HttpClient 所以 要使用HttpClient要加载库文件 1 com
  • 单向散列函数(Hash)

    0 Hash函数的性质 常用Hash函数 MD5 128bit SHA 1 160bit 等 1 使用Hash 函数进行完整性验证的模型 2 使用Hash函数进行口令验证 1 3 使用Hash函数进行口令验证 2 4 使用Hash解决数字签
  • 剑指offer(简单)

    目录 数组中重复的数字 替换空格 从尾到头打印链表 用两个栈实现队列 斐波那契数列 青蛙跳台阶问题 旋转数组的最小数字 二进制中的1的个数 打印从1到最大的n位数 删除链表的节点 调整数组顺序使奇数位于偶数前面 链表中倒数第k个节点 反转链
  • 史上最详细的maven仓库详解

    写在前面 我是 沸羊羊 昵称来自于姓名的缩写 fyy 之前呕心沥血经营的博客因手残意外注销 现经营此账号 本人是个小菜 正向着全栈工程师的方向努力着 文章可能并不高产 也很基础 但每写一篇都在用心总结 请大佬勿喷 如果您对编程有兴趣 请关注