写在前面:

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

文章目录

  • 1 概述
  • 2 解读Jar在仓库中的存储路径
  • 3 maven仓库
    • 3.1 本地仓库
    • 3.2 远程仓库
      • 3.2.1 私服
      • 3.2.2 中央仓库
  • 4 远程仓库配置
    • mirrors 与 respository
  • 5 maven依赖搜索顺序

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中央仓库
  • 默认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,当然也可以重写URLmirror相当于一个拦截器,它会拦截 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默认的中央仓库配置。

史上最详细的maven仓库详解相关推荐

  1. android 红包功能,史上最详细的微信抢红包详解

    一.技术背景 辅助功能设计初衷在于帮助残障用户使用android设备和应用,在后台运行,可以监听用户界面的一些状态转换,例如页面切换.焦点改变.通知.Toast等,并在触发AccessibilityE ...

  2. centos7中ps显示的内容_值得收藏,史上最全Linux ps命令详解

    原标题:值得收藏,史上最全Linux ps命令详解 一.程序员的疑惑 大概在十多年前,我当时还是一个产品经理.由于一些工作的原因,需要向运维工程师学习一些linux常用命令. 当使用linux ps这 ...

  3. 史上最全的IP地址详解,速来get

    史上最全的IP地址详解 白在了解虚拟机网络之前,我们首先得了解ip地址是什么? 1.简单局域网的构成 局域网:一般称为内网 简单局域网的构成:交换机.网线.PC(其他IT终端) 交换机:用来组建内网的 ...

  4. 史上最全YYModel的使用详解

    原文链接:http://www.jianshu.com/p/25e678fa43d3 demo链接:https://github.com/walkertop/YYModel---Demo 插件链接:h ...

  5. 史上最全JavaScript数组对象详解(二)

    JavaScript数组对象详解(二) 上一篇博客我们讲到了JavaScript数组对象的创建,访问和属性,接下来一篇博客主要讲一下JavaScript数组对象的方法及使用.说到数组的方法,主要分为两 ...

  6. 「万字图文」史上最姨母级Java继承详解

    原创公众号:「bigsai」 除公众号以外拒绝任意擅自转载 文章收录在bigsai公众号和回车课堂 课程导学 在Java课堂中,所有老师不得不提到面向对象(Object Oriented),而在谈到面 ...

  7. 广成子:值得收藏-史上最全Linux ps命令详解

    From 闻茂泉(广成)AliDataOps 一.程序员的疑惑   大概在十多年前,我当时还是一个产品经理.由于一些工作的原因,需要向运维工程师学习一些linux常用命令.当使用linux ps这个十 ...

  8. 史上最清楚的BP算法详解

    前馈神经网络 在文章<逻辑回归到神经网络>(以下简写<LR到NN>)中,小夕为大家描述了一个从逻辑回归延伸到神经网络的过程.在<一般化机器学习与神经网络>中,小夕阐 ...

  9. 史上最全jmeter逻辑控制器案例详解

    在jmeter中逻辑控制器可以控制采样器(samplers)的执行顺序.由此可知,控制器需要和采样器一起使用,否则控制器就没有什么意义了.放在控制器下面的所有的采样器都会当做一个整体,执行时也会一起被 ...

最新文章

  1. 如果MySQL磁盘满了,会发生什么?
  2. 修改can接口波特率_CAN总线分析仪使用
  3. CTFshow 反序列化 web269
  4. 软件工程的瀑布, 大泥球, 教堂,集市,和银弹
  5. 4________请拖拽到此区域5________请拖拽到此区域_5分钟学会:蒙版与通道(剪贴蒙版)...
  6. silverlight 自定义资源整理(待后续补充)
  7. 字节跳动斩获支付牌照欲建金融帝国,技术实力配得上野心吗?
  8. codova添加android慢_从 0 开始学 Linux 内核之 android 内核栈溢出 ROP 利用
  9. 用python画漂亮图-使用 Python/matplotlib 画出漂亮的论文插图
  10. typecast java_Delphi设置无效的Typecast
  11. 计算机无线网络连接怎么弄,Win7系统如何设置无线网络连接?
  12. 零基础转行网络安全可以做什么工作
  13. ESP8266控制SG90舵机
  14. 【单片机仿真】(五)寻址方式 — 立即寻址与寄存器间接寻址
  15. Android开机执行指定shell脚本
  16. discuz制作自己的门户列表模板
  17. spring cloud alibaba全家桶之nacos
  18. Real-Time-Voice-Cloning(github声音克隆项目演示)
  19. 划分数,分苹果问题·计算机算法·动态规划·C/C++
  20. linux 查找出包含某个字符串的所有文件的方法详解

热门文章

  1. NYIST 708 ones java
  2. 数据规整化:清理、转换、合并、重塑 《用Python进行数据分析》读书笔记第7章
  3. lm80认证_什么是LM-80测试什么产品需要做LM-80测试
  4. 学习笔记(01):大数据云端实验室项目实战-微博舆情大数据分析-大数据云端实验室项目实战-微博舆情大数据分析-1...
  5. Centos 系统优化
  6. 做测试,如何提升“话语权”?
  7. R语言ggplot2可视化:使用patchwork包将多个ggplot2可视化结果组合起来、使用plot_spacer函数在组合结果图像中的指定位置加入空白区域(不包含任何内容,纯粹空白图)
  8. Springboot启动报错[ main] o.s.boot.SpringApplication: Application run failed
  9. 友推SDK微信分享问题
  10. TAQ服务器npc多久自动交物资,魔兽世界怀旧服:奥罗服务器物资捐献完成,已成国服第一个开门...