Maven仓库统计

仓库梳理

之前说了很多仓库,想必已经很乱了,做一节梳理

Repository(仓库)

  1. Maven仓库主要有2种:
    • remote repository:相当于公共的仓库,大家都能访问到,一般可以用URL的形式访问
    • local repository:存放在本地磁盘的一个文件夹,例如,windows上默认是C:\Users\{用户名}.m2\repository目录
  2. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
<mirrors>

<mirror>
    <id>myRepository1</id>
    <mirrorOf>nexus-aliyun</mirrorOf>
    <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror> 
     <mirror>
      <id>nexus-myself</id>
      <mirrorOf>central</mirrorOf>
      <name>Nexus myself</name>
      <url>http://172.30.201.35:8081/repository/maven-public/</url>
     </mirror>
  </mirrors>

可见

  1. 需要访问aliyun仓库时会走myRepository1镜像
  2. 需要访问中央仓库时会走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用户使用。

优点主要有:

  1. 节省外网宽带
  2. 加速Maven构建
  3. 部署第三方构件
  4. 提高稳定性、增强控制:原因是外网不稳定
  5. 降低中央仓库的负荷:原因是中央仓库访问量太大

Maven仓库示意图

总结

简单点来说,repository就是个仓库。maven里有两种仓库,本地仓库和远程仓库。远程仓库相当于公共的仓库,大家都能看到。本地仓库是你本地的一个山寨版,只有你看的到,主要起缓存作用。当你向仓库请求插件或依赖的时候,会先检查本地仓库里是否有。如果有则直接返回,否则会向远程仓库请求,并做缓存。你也可以把你做的东西上传到本地仓库给你本地自己用,或上传到远程仓库,供大家使用。

远程仓库可以在工程的pom.xml文件里指定,楼上两位已经列的很清楚了。如果没指定,默认就会把下面这地方做远程仓库,即默认会到http://repo1.maven.org/maven2这个地方去请求插件和依赖包。

1
2
3
4
5
6
7
8
<repository>  
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2</url>
</repository>

本地仓库默认在你本地的用户目录下的.m2/repository目录下。

mirror就是镜像,主要提供一个方便地切换远程仓库地址的途径。比如,上班的时候在公司,用电信的网络,连的是电信的仓库。回到家后,是网通的网络,我想连网通的仓库,就可以通过mirror配置,统一把我工程里的仓库地址都改成联通的,而不用到具体工程配置文件里一个一个地改地址。  mirror的配置在.m2/settings.xml里。如:

1
2
3
4
5
6
7
8
<mirrors>  
<mirror>
<id>UK</id>
<name>UK Central</name>
<url>http://uk.maven.org/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>

这样的话,就会给上面id为central的远程仓库做了个镜像。以后向central这个仓库发的请求都会发到http://uk.maven.org/maven2而不是http://repo1.maven.org/maven2了。  central里是要替代的仓库的id。如果填*,就会替代所有仓库。

参考资料:

https://blog.csdn.net/scythe666/article/details/51881534


Maven仓库统计
https://andrewjiao.github.io/2019/02/24/Maven仓库/
作者
Andrew_Jiao
发布于
2019年2月24日
许可协议