Maven仓库统计
仓库梳理
之前说了很多仓库,想必已经很乱了,做一节梳理
Repository(仓库)
- Maven仓库主要有2种:
- remote repository:相当于公共的仓库,大家都能访问到,一般可以用URL的形式访问
- local repository:存放在本地磁盘的一个文件夹,例如,windows上默认是C:\Users\{用户名}.m2\repository目录
- Remote Repository主要有3种:
- 中央仓库:http://repo1.maven.org/maven2/
- 私服:内网自建的maven repository,其URL是一个内部网址
- 其他公共仓库:其他可以互联网公共访问maven repository,例如 jboss repository等
repository(本地库或远程库)存放各种jar包或Maven插件,当用户请求获取新的依赖时会访问本地库,若本地库没有相关依赖则访问远程库获取依赖并缓存到本地库中。可以将做好的jar包放到本地库中供自己使用,或上传到远程库供大家使用。
Mirror(镜像)
Mirror类似拦截器,会拦截maven向远程仓库的请求,将请求重定向到setting.xml中<Mirror>
标签配置的仓库地址。
- 没有配置Mirror
- 配置了Mirror(B为A仓库的镜像)
镜像仓库可认为是远程仓库的完全备份,从远程仓库获取的依赖一样可以从镜像仓库中获取
关于mirrorOf
- 配置mirrorOf时需要确保仓库间实际上是有关联的,如何关联可参考私库创建
<mirrorOf>
标签用于配置具体的远程仓库名称,它的作用是限定特定依赖请求访问特定镜像。例如本地中可能会配置多个镜像A和B,当我们想限定通过A镜像访问中央仓库,用B镜像访问阿里云仓库时,需要分别配置mirrorOf标签的远程仓库名称。
例如
1 |
|
可见
- 需要访问aliyun仓库时会走myRepository1镜像
- 需要访问中央仓库时会走nexus-myself镜像
他们对应的jar包会分别缓存到上述不同的镜像库中取(镜像只是一个概念问题,本质上各个仓库时想和独立的,只是在构建仓库时会关联双方)
具体配置如下
<mirrorOf>*</mirrorOf>
匹配所有远程仓库。
<mirrorOf>repo1,repo2</mirrorOf>
匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。
<mirrorOf>*,!repo1</miiroOf>
匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。
定义
其实,mirror表示的是两个Repository之间的关系,在maven配置文件(setting.xml)里配置了<mirrors><mirror>..........</mirror></mirrors>
,即定义了两个Repository之间的镜像关系。
目的
配置两个Repository之间的镜像关系,一般是出于访问速度和下载速度考虑。
例如, 有一个项目,需要在公司和住所都编码,并在项目pom.xml配置了A Maven库。在公司,是电信网络,访问A库很快,所以maven管理依赖和插件都从A库下载;在住所,是网通网络,访问A库很慢,但是访问B库很快。这时,在住所的setting.xml里,只要配置一下<mirrors><mirror>....</mirror></mirrors>
,让B库成为A库的mirror,即可不用更改项目pom.xml里对于A库的相关配置。
如果该镜像仓库需要认证,则配置setting.xml中的<server></server>
即可。
需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件。
配置优先顺序
1、在mirrorOf与repositoryId相同的时候优先是使用mirror的地址
2、mirrorOf等于*的时候覆盖所有repository配置
3、存在多个mirror配置的时候mirrorOf等于*放到最后
4、只配置mirrorOf为central的时候可以不用配置repository
私服
私服是一种特殊的远程Maven仓库,它是架设在局域网内的仓库服务,私服一般被配置为互联网远程仓库的镜像,供局域网内的Maven用户使用。
当Maven需要下载构件的时候,先向私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,同时缓存在私服之上,然后为Maven下载请求提供下载服务,另外,对于自定义或第三方的jar可以从本地上传到私服,供局域网内其他maven用户使用。
优点主要有:
- 节省外网宽带
- 加速Maven构建
- 部署第三方构件
- 提高稳定性、增强控制:原因是外网不稳定
- 降低中央仓库的负荷:原因是中央仓库访问量太大
Maven仓库示意图
总结
简单点来说,repository就是个仓库。maven里有两种仓库,本地仓库和远程仓库。远程仓库相当于公共的仓库,大家都能看到。本地仓库是你本地的一个山寨版,只有你看的到,主要起缓存作用。当你向仓库请求插件或依赖的时候,会先检查本地仓库里是否有。如果有则直接返回,否则会向远程仓库请求,并做缓存。你也可以把你做的东西上传到本地仓库给你本地自己用,或上传到远程仓库,供大家使用。
远程仓库可以在工程的pom.xml文件里指定,楼上两位已经列的很清楚了。如果没指定,默认就会把下面这地方做远程仓库,即默认会到http://repo1.maven.org/maven2这个地方去请求插件和依赖包。
1 |
|
本地仓库默认在你本地的用户目录下的.m2/repository目录下。
mirror就是镜像,主要提供一个方便地切换远程仓库地址的途径。比如,上班的时候在公司,用电信的网络,连的是电信的仓库。回到家后,是网通的网络,我想连网通的仓库,就可以通过mirror配置,统一把我工程里的仓库地址都改成联通的,而不用到具体工程配置文件里一个一个地改地址。 mirror的配置在.m2/settings.xml里。如:
1 |
|
这样的话,就会给上面id为central的远程仓库做了个镜像。以后向central这个仓库发的请求都会发到http://uk.maven.org/maven2而不是http://repo1.maven.org/maven2了。
参考资料: