1.什么是maven仓库
1)maven世界中,任何一个项目的依赖、插件、或者项目输出,都可以称之为构件,每个构件都有唯一坐标供mave。
2)每一个工作站上可能有几个或者十几个或者更多的maven项目,这些maven项目可能都依赖一些相同的构件,那么在每个项目中都拷贝一份相同的构件显然是不合理的,这样不仅会造成磁盘空间的浪费,还可能因为构件版本版本的差异造成一些不必要的麻烦。
3)maven在某一个位置统一存储所有maven项目共享的构件,这个统一的位置就是仓库,实际的maven项目都不需要再存储自身所依赖的构件,只需要声明所依赖构件的坐标,在项目运行时,maven会根据坐标到仓库中找到这些构件,然后加到classpath中,这样不但节省空间,还将构件的版本进行统一的管理(实际上maven的好处还有很多),一举多得。
2. 仓库的分类
1)对于maven仓库只有两种 ,本地仓库和远程仓库。maven运行时会根据坐标寻找构件,首先会在现在本地仓库寻找目标,如果本地仓库不存在目标构件,maven会去远程仓库寻找,当远程仓库也没有找到目标构件时,maven就会报错。如果在远程仓库找到目标构件,便会下载到本地仓库供项目使用。
2)远程仓库也可以分为三种,中央仓库、 私服、其它的三方仓库。前者是maven自带的远程仓库,包含了绝大部分的开源构件,在默认配置下,如果本地仓库不存在目标构件,maven获取中央仓库寻找目标构件。
3)私服是一种在局域网范围内搭建的一种特殊的远程仓库,由于中央仓库服务器在国外,且访问量及其重大,难免会出现速度慢,假如公司里的每个员工都访问中央仓库,对带宽也是一种浪费,并且对于项目中一些私有的构件,中央仓库时没有的。所以私服就是为了解决以上问题的,可以让私服代理中央仓库,然后让公司员工统一访问私服,节省带宽,速度也快,私有的构件也可以上传到私服中,供他人使用,一举多得。
3.自定义本地仓库的存储位置。
1)maven默认的仓库存储位置在C盘的的users/用户名称/.m2/repository下,有时候因为某些原因,比如c盘空间不够,需要自定义仓库存储路径,可以编辑setting.xml 文件的localRepository元素,setting.xml文件存放在 maven的安装目录下的config文件夹下:
<localRepository>D:\ALANWANG-AIA\myRepository</localRepository>
2)修改maven安装目录的config下的setting.xml的作用域是计算机级别的,这样做的坏处是计算机多个用户会共用一个库,且maven每次升级时setting文件可能会被覆盖掉,这是就需要重新指定 本地库的位置了。如果需要定义用户级别本地库,只需要把setting.xml 拷贝到用户的.m2目录下就可以,这样就可以定制用户自己的本地库,maven升级时也不用修改setting.xml 。
4.远程仓库的配置
安装好maven以后,如果不执行任何命令,本地仓库目录是不存在的,当用户输入第一条命令时,maven才会创建本地仓库,然后根据配置和需要,从远程仓库下载构件至本地仓库。由于最原始的本地仓库是空的,maven必须知道至少一个远程仓库是可用的,才能在执行命令的时候下载到构件,中央仓库就是这样一个默认的远程仓库,maven的安装文件自带了远程仓库的配置,该配置文件名为pom-4.0.0.xml,该配置文件存放在maven-model-bulider-3.0.jar(maven3) 中,不同的版本可能存放的位置不同,但是名称都是pom-4.0.0.xml,打开可以看到:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
这段配置是所有maven项目都会继承的超级pom.其中url就是远程仓库的地址,可以拷贝该地址到浏览器,可以浏览到该仓库的所有构件。
还有一种特殊的远程仓库叫做私服,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的用户使用。当maven 需要下载构件的时候,会首先请求私服,私服如果不存在该构件,就会转而请求远程仓库,如果远程仓库存在该构件,那么该构件会被缓存到私服上,然后在供局域网内用户使用。
之所以会架设私服,是因为私服可以为我们带来以下好处,
1,节省外网带宽,大量对外部仓库重复请求会消耗很大的带宽,利用私服代理远程仓库以后,只需要第一次下载构件时去请求远程仓库,所下载的构件就被缓存到了私服上,其他用户再次请求该构件时,只需要从私服拿可以了。
2,加速构建,使用过中央仓库的用户可以发现,请求中央仓库会很慢,一是网络的问题,二是maven执行构建的时候会不停的检查远程仓库数据,如果使用私服,这些问题就不存在了。
3,部署第三方构件,当某个构件用户自行开发的构件,这样的构件无法从外部仓库获得,建立私服以后,便可以将这些构件上传到私服,供用户自行使用。
4,提高稳定性,降低中央仓库负荷,假如外部网络无法使用,由于私服已经缓存了大量构件,只要不下载新构件,就不会对开发造成任何影响,同时,由于中央仓库访问量巨大,维护及其艰难,能尽量减少访问就减少访问。