史上最详细的maven仓库详解

写在前面:

我是「沸羊羊_」,昵称来自于姓名的缩写 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默认的中央仓库配置。

猜你喜欢

转载自blog.csdn.net/weixin_42653522/article/details/108588726