Maven学习笔记(四)——仓库

仓库定义

得益于座标机制,任何Maven项目使用任何一个构件的方式都是完全相同的。在此基础上,Maven可以在某个位置可以统一存储所有Maven项目共享的构件,这个统一的位置就是仓库。实际的Maven项目将不再各自存储其依赖文件,他们只需要声明这些依赖的座标,在需要的时候,Maven就会自动根据座标找到仓库中的构件,并使用它们。

仓库布局

任何构件都有其唯一的座标,根据这个座标可以定义其在仓库中的唯一存储路径,这便是Maven的布局方式。例如,log4j : log4j : 1.2.15这一依赖,其对应的仓库路径为log4j/log4j/1.2.15/log4j-1.2.15.jar,该路径与座标的大致对应关系为groupId/artifactId/version/artifactId-version.packaging。

仓库分类

对于Maven来说,仓库只分两类:本地仓库和远程仓库。当Maven根据座标寻找构件的时候,它会首先查看本地仓库,如果本地仓库存在此构件,将直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有需要的构件,Maven就会报错。
有一些特殊的远程仓库,中央仓库是Maven核心自带的远程仓库,它包含了大部分开源的构件。在默认配置下,当本地仓库没有Maven需要的构件的时候,它就会尝试从中央仓库下载。
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有的外部远程仓库。内部的项目还能部署到私服上供其他项目使用。
分类如图:
在这里插入图片描述

本地仓库

一般来说,在Maven项目目录下,没有像lib/这样用来存放依赖文件的目录,当Maven在执行编译或测试时,如果需要使用依赖文件,它总是基于座标使用本地仓库的依赖文件。
默认情况下,不管是在Windows或在Linux文件中,每个用户在自己的用户目录下都有一个路径名为./m2/repository/的仓库目录。在类Linux系统中,以(.)开头的文件或目录默认是隐藏的,可以使用ls -a命令显示隐藏文件或目录。
有时候,因为某些原因,用户会想要自定义本地仓库目录地址。可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。
需要注意的是,默认情况下,文件~/.m2/settings.xml是不存在的,用户需要从Maven安装目录复制$M2_HOME/conf/settings.xml文件再进行编辑。推荐不要直接修改全局目录的settings.xml文件。
一个构件只有在本地仓库中,才能被Maven项目使用,进入本地仓库的方式有两种,一种是依赖Maven从远程仓库下载到本地仓库,另一种是将本地项目的构件安装到Maven仓库中。

远程仓库

安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。当用户输入第一条Maven命令后,Maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件到本地仓库。

中央仓库

由于最原始的本地仓库是空的,Maven必须要知道一个至少可用的远程仓库,才能在执行Maven命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库,Maven的安装文件自带了中央仓库的配置。

私服

私服是一种特殊的远程仓库,它是假设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从仓库的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。此外,一些无法从外部仓库下载到的构件也能从本地上传到私服供人使用。如图:
在这里插入图片描述
私服优势:

  • 节省自己的外网带宽
  • 加速Maven构建
  • 部署第三方构件
  • 提高稳定性,增强控制
  • 降低中央仓库的负荷

快照版本

带有SNAPSHOT就是组件的快照版本。
假设模块B依赖于模块A,将模块A的版本设定为2.1-SNAPSHOT,然后发布到私服中,在发布的过程中,Maven就会自动为构件打上时间戳。比如2.1-20091214.221414-13就表示2009年12月14日22点14分14秒的第13次快照。有了该时间戳,Maven就能随时找到仓库中该构件2.1-SNAPSHOT版本最新的文件。在构件B模块的时候,Maven会自动从仓库中检查模块A的2.1-SNAPSHOT的最新构件,发现有更新时便下载。默认情况下,Maven每天检查一次更新,用户也可以使用命令行-U参数强制让Maven检查更新。

从仓库解析依赖的机制

当本地仓库没有依赖构件的时候,Maven会自动从远程仓库下载;当依赖版本为快照版本的时候,Maven会自动找到最新的快照。机制如下:

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

镜像

如果仓库X可以提供仓库Y存储的所有内容,那么就可以任务X是Y的一个镜像。也就是任何一个可以从仓库Y获得的构件,都能从它的镜像中获取。比如用中国的镜像可以比国外的提供更快更稳定的服务。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章