Maven必知必会 - 仓库

290 阅读4分钟

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

Maven必知必会 - 仓库

Maven这个工具基本做Java的都会用,但是一些相关的基础概念反而成为一个容易被大家忽视的东西,我们日常都在用,但是很多人都是进一家公司后和别人要了一个别人配好的settings文件之后就再也没管了,有时候配置有问题也不知道咋排查。本文就一些Maven重要概念以及settings.xml和POM的一些配置做说明。

仓库

对于Maven来说,其实只分为本地仓库和远程仓库。但是实际开发中我们还会涉及很多仓库的名词,如下:

本地仓库

就是settings文件中localRepository标签配置的路径。离我们最近的仓库,可以当做远程仓库拉倒本地做的一层缓存。该仓库在用户第一次执行maven命令的时候将被初始化。

远程仓库

我们自己开发的jar包需要让别人一起使用自然就需要将jar传输到远程上去。

中央仓库

Maven必须至少有一个可用的远程仓库,Maven内部默认了一个id为central的中央仓库,也就是Maven的官方仓库。不过这个仓库在国内访问会很慢,所以才需要镜像。

私服仓库

公司一般都会有自己对应的私服,因为你本地开发的jar包可能别人也需要用,但是它又不好传到中央仓库上,所以需要私服来存储我们公司内部的代码。同时基于内网搭建私服可以加速我们访问,并且节省公网的带宽。

镜像

上面说到,Maven的远程仓库访问是很慢的,并且任何一个中心化的远程仓库都会很慢,所以我们会将一个远程仓库镜像多个副本,类似于CDN的方式来减轻中央仓库的网络压力,和提高各地的访问速度。当你访问mirror指定的mirrorOf配置的仓库的时候,会转到请求镜像指定的maven仓库中获取资源。

工作模式

当我们项目添加一个依赖的引用的时候,Maven会按照下面这个模式去仓库中获取对应的jar包。

image.png

  1. Maven首先会检查本地仓库,如果本地仓库存在需要jar,就会直接使用本地的。
  2. 如果本地没有的话,会去私服去拉取对应的jar包。
    1. 如果没有配置私服,就会去中央仓库去下载(即id为central的)。
    2. 如果配置了私服,但私服不存在该jar,则私服会去远程中央仓库去下载,缓存到私服,然后再缓存到本地。
    3. 如果配置了私服,私服存在该jar,则直接缓存到本地。
  3. 如果私服或者中央仓库配置了镜像,那么请求私服地址的请求会转向请求镜像去拉取。

而开发中也在POM中也可能配置了仓库信息,这样下载jar包的方式就变为:

  1. 本地仓库优先找。
  2. setting配置的profile并激活的仓库中找。
  3. 如果setting中没有配置或者没有激活,那么就会去POM中配置并激活的仓库中去找。
  4. 如果此时还是没有确定仓库,就去central去找。
  5. 如果central或者远程仓库有被镜像代理了,那么会直接走镜像,而不会走配置的远程仓库的地址。

所以,顺序为:本地仓库 > settings.xml的profile的仓库 > pom.xml的profile的仓库 >pom.xml的仓库 > 中央仓库。

特别说下镜像:上面也说了,私服一般都是为我们,所以我们一般可以结合镜像,代理我们所有的仓库。这样就会让所有的jar都会走私服的地址。私服会代理我们去对应的远程一些中央仓库中去下载对应的jar包。