本文以 Maven的Mirror和Repository 的详细讲解以模板进行编写
主要是对原文进行小量补充,但想到到CSDN积分,挂了原创的牌子,原创见谅~
18.11.9 松江图书馆
设置remote repository:相当于公共的仓库,大家都能访问到,一般可以用URL的形式访问
local repository:存放在本地磁盘的一个文件夹,例如,windows上默认是C:\Users\{用户名}.m2\repository目录
中央仓库:http://repo1.maven.org/maven2/
私服:内网自建的maven repository,其URL是一个内部网址
其他公共仓库:其他可以互联网公共访问maven repository,例如 jboss repository等,
repository里存放的都是各种jar包和maven插件。当向仓库请求插件或依赖的时候,会先检查local
repository,如果local repository有则直接返回,否则会向remote repository请求,并缓存到local
repository。也可以把做的东西放到本地仓库,仅供本地使用;或上传到远程仓库,供大家使用。
maven默认是从center库中进行依赖资源,地址为http://central.maven.org/maven2/,且并非是在settings.xml中设置的(推断是它读取的一些其它默认配置文件)。
但同时,我们也可以在本工程的pom.xml中,设置我们自己的远程仓库,且设置的新仓库和center仓库是并存的,并不会覆盖。
注意在项目的pom.xml设置,非maven根目录下的setting.xml
< project >
...
< repositories >
< repository >
< id >maven-net-cn</ id >
< name >Maven China Mirror</ name >
< url >http://maven.net.cn/content/groups/public/</ url >
< releases >
< enabled >true</ enabled >
</ releases >
< snapshots >
< enabled >false</ enabled >
</ snapshots >
</ repository >
</ repositories >
< pluginRepositories >
< pluginRepository >
< id >maven-net-cn</ id >
< name >Maven China Mirror</ name >
< url >http://maven.net.cn/content/groups/public/</ url >
< releases >
< enabled >true</ enabled >
</ releases >
< snapshots >
< enabled >false</ enabled >
</ snapshots >
</ pluginRepository >
</ pluginRepositories >
...
</ project >
这个设置,设置了本程在进行依赖资源时,会做些在center库的中国库中进行查找,如果没找到,才会去center库中查找;(有点像设置center库的中国镜像,后面会讲)
同时,这里也可以设置私服仓库的url;
讲到这里,我们应当有概念: maven默认center库,同时,我们也可以在本工程中,在pom中设置不同的库
在 settings.xml中,配置
当然,借助IDE开发maven时,一定要把settings.xml表设置为IDE默认解析的表,表中的设置才能生效。
有一个小梗:
之前我一直有一个疑惑,maven可以帮我们管理jar包,通过denpendices标签引入依赖,但在初次构建一个maven项目时,我还没有引入任何依赖,却看到IDE要下载很多jar包下来放在了本地的.m2仓库中 ,why?
后来,大概困惑了几天,才明白,那是因为构建一个maven项目,它本身所提供的服务,也是基于一些jar包和一些配置文件,而它的这些jar包,也放在maven库中,所以构建它,会自动引入。
所以,当使用IDE构建一个maven项目的时,没有可引用的本地.m2,或者.m2仓库中没有maven构建需要的一些基础依赖资源,那们,此时构建项目就会花点时间,会下载大概100M多的初始依赖。
mirror 首先理解它,翻译过来就是“镜像”,而对应的应该意思就是“备份”;而在mvaen中,mirror除镜像的意思外,还应该理解它是一个代理仓库,或是一个“拦截器”,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。
此时,B Repository被称为A Repository的镜像。
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都胡够从它的镜像中获取。
标签里面放置的是要被镜像的Repository ID。为了满足一些复杂的需求,Maven还支持更高级的镜像配置:
*
匹配所有远程仓库。
repo1,repo2
匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。
*,!repo1
匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。
其实,mirror表示的是两个Repository之间的关系,在maven配置文件(setting.xml)里配置 了…, 即定义了两个Repository之间的镜像关系。
配置两个Repository之间的镜像关系,一般是出于访问速度和下载速度考虑。
example 1:
maven默认center库为http://central.maven.org/maven2/,而这个库类目虽然庞大,但因为远在海外,同时超高的访问量,所以如果使用它作为作为远程库,依赖jar包,效率并不高
而http://maven.net.cn/content/groups/public/ 是center库的中国镜像,由于地理位置的因素,该镜像往往能够提供比中央仓库更快的务。因此,可以配置Maven使用该镜像来替代中央仓库。编辑settings.xml,代码如下
<settings>
...
<mirrors>
<mirror>
<id>maven.net.cn</id>
<name>one of the central mirrors in china</name>
<url>http://maven.net.cn/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
同时,现在也推荐用aliyun的镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
从用户出发的话,我们希望能从aliyun处迅速拿到依赖资源,但作为aliyun云,它能作为center库的镜像,应当有和center库资源同步的机制,同时类目的结构应当相同的。
example 2:
有一个项目,需要在公司和住所都编码,并在项目pom.xml配置了A Maven库。在公司,是电信网络,访问A库很快,所以maven管理依赖和插件都从A库下载;在住所,是网通网络,访问A库很慢,但是访问B库很快。这 时,在住所的setting.xml里,只要配置一 下…,让B库成为A 库的mirror,即可不用更改项目pom.xml里对于A库的相关配置。
如果该镜像仓库需要认证,则配置setting.xml中的即可。
这里会涉及几个点:
需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件。
私服是一种特殊的远程Maven仓库,它是架设在局域网内的仓库服务,私服一般被配置为互联网远程仓库的镜像,供局域网内的Maven用户使用。
当Maven需要下载构件的时候,先向私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,同时缓存在私服之上,然后为Maven下载请求提供下载服务,另外,对于自定义或第三方的jar可以从本地上传到私服,供局域网内其他maven用户使用。
优点主要有:
节省外网宽带
加速Maven构建
部署第三方构件
提高稳定性、增强控制:原因是外网不稳定
降低中央仓库的负荷:原因是中央仓库访问量太大
更多文章参考:
maven修改本地仓库,远程仓库与中央仓库
https://www.cnblogs.com/cnblog-long/p/6611383.html
Maven:mirror和repository 区别
https://www.cnblogs.com/sharpest/p/8011546.html