Maven 仓库

简介

Maven 可以在某个位置统一存储所有 Maven 项目共享的构件,这个统一的位置就是仓库。实际的 Maven 项目将不会各自存储其依赖文件,它们只需要声明这些依赖的坐标,在需要的时候(例如,编译项目的时候需要将依赖加入到 classpath 中),Maven 会自动根据坐标找到仓库中的构件,并使用它们。为了实现重用,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其他项目使用

仓库分类

对于 Maven 来说,仓库只分为两类:本地仓库和远程仓库

当 Maven 根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在此构件,则直接使用;如果本地仓库不存在此构件,或者需要查看是否有更新的构件版本,Maven 就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有需要的构件,Maven 就会报错

在这个最基本分类的基础上,还有必要介绍一些特殊的远程仓库。中央仓库是 Maven 核心自带的远程仓库,它包含了绝大部分开源的构件。在默认配置下,当本地仓库没有 Maven 需要的构件的时候,它就会尝试从中央仓库下载

私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用

除了中央仓库和私服,还有很多其他公开的远程仓库,常见的有 java.net Maven 库 和 JBoss Maven 库 等

Maven 仓库的分类

本地仓库

一般来说,在 Maven 项目目录下,没有诸如 lib/ 这样用来存放依赖文件的目录。当 Maven 在执行编译或测试时,如果需要使用依赖文件,它总是基于坐标使用本地仓库的依赖文件

默认情况下,不管在 Window 还是 Linux 下,每个用户在自己用户目录下都有一个路径名为 .m2/repository/ 的仓库目录。如果想自定义本地仓库目录地址。可以编辑文件
~/.m2/settings.xml,设置 localRepository 元素的值为想要的仓库地址

需要注意的是,默认情况下,~/.m2/settings.xml 文件不存在,用户需要从 Maven 安装目录复制 $M2_HOME/conf/settings.xml 文件再进行编辑

一个构件只有在本地仓库中之后,才能由其他 Maven 项目使用,那么构件如何进入到本地仓库中呢?最常见的是依赖 Maven 从远程仓库下载到本地仓库中。例如,本地有两个项目 A 和 B,两者都无法从远程仓库获得,而同时 A 又依赖于 B,为了能构建 A,B 就必须首先得以构建并安装到本地仓库中

构建并安装到本地仓库的方法:在项目中执行 mvn clean install

远程仓库

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

本地仓库就好比书房,需要读书时就先从书房找,相应地,Maven 需要构件的时候先从本地仓库找。远程仓库就好比书店,无法从书房找到书的时候,就会从书店购买后放到书房里。当 Maven 无法从本地仓库找到需要的构件时,就会从远程仓库下载构件至本地仓库。一般地,对于每个人来说,书房只有一个,但外面的书店有很多,类似地,对 Maven 来说,每个用户只有一个本地仓库,但可以配置访问很多远程仓库

中央仓库

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

私服

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

上图展示的是组织内部使用私服的情况。即使在一台直接连入 Internet 的个人机器上使用 Maven,也应该在本地建立私服。因为私服可以帮助你:

  • 节省自己的外网带宽。建立私服同样可以减少组织自己的开支,大量的对于外部仓库的重复请求会消耗很大的带宽,利用私服代理外部仓库后,对外的重复构件下载便得以消除

  • 加速 Maven 构建。不停地连接请求外部仓库是十分耗时地,但是 Maven 的一些内部机制(如快照更新检查)要求 Maven 在执行构建的时候不停地检查远程仓库数据。因此,当项目配置了很多外部仓库时,构建地速度会被大大降低。使用私服可以很好地解决这一问题,当 Maven 只需检查局域网内私服的数据时,构建的速度便能得到很大程度的提高

  • 部署第三方构件。当某个构件无法从任何一个外部远程仓库获得,怎么办?

你可能感兴趣的:(Maven 仓库)