Maven的repository介绍和 mirror设置

Maven的repository介绍 和 mirror设置

本文以 Maven的Mirror和Repository 的详细讲解以模板进行编写
主要是对原文进行小量补充,但想到到CSDN积分,挂了原创的牌子,原创见谅~

18.11.9 松江图书馆

  • 1 Repository(仓库)
    • 1.1 Maven仓库主要有2种:
    • 1.2 Remote Repository主要有3种:
    • 1.3定义仓库
    • 1.4定义本地仓库
  • 2 Mirror(镜像)
    • 2.1 没有配置mirror:
    • 2.2 配置mirror:
    • 2.3 设置
  • 3 Repository与Mirror
    • 3.1 定义
    • 3.2 配置mirror的目的
    • 3.3 注意
  • 4 私服

1 Repository(仓库)

在这里插入图片描述

1.1 Maven仓库主要有2种:

remote repository:相当于公共的仓库,大家都能访问到,一般可以用URL的形式访问

local repository:存放在本地磁盘的一个文件夹,例如,windows上默认是C:\Users\{用户名}.m2\repository目录

1.2 Remote Repository主要有3种:

中央仓库:http://repo1.maven.org/maven2/

私服:内网自建的maven repository,其URL是一个内部网址

其他公共仓库:其他可以互联网公共访问maven repository,例如 jboss repository等,

repository里存放的都是各种jar包和maven插件。当向仓库请求插件或依赖的时候,会先检查local

repository,如果local repository有则直接返回,否则会向remote repository请求,并缓存到local
repository。也可以把做的东西放到本地仓库,仅供本地使用;或上传到远程仓库,供大家使用。

1.3定义远程仓库

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中设置不同的库

1.4设置本地仓库 地址

在 settings.xml中,配置

/path (如:E:\.m2\repository)

当然,借助IDE开发maven时,一定要把settings.xml表设置为IDE默认解析的表,表中的设置才能生效。

有一个小梗:

之前我一直有一个疑惑,maven可以帮我们管理jar包,通过denpendices标签引入依赖,但在初次构建一个maven项目时,我还没有引入任何依赖,却看到IDE要下载很多jar包下来放在了本地的.m2仓库中 ,why?

后来,大概困惑了几天,才明白,那是因为构建一个maven项目,它本身所提供的服务,也是基于一些jar包和一些配置文件,而它的这些jar包,也放在maven库中,所以构建它,会自动引入。

所以,当使用IDE构建一个maven项目的时,没有可引用的本地.m2,或者.m2仓库中没有maven构建需要的一些基础依赖资源,那们,此时构建项目就会花点时间,会下载大概100M多的初始依赖。


2 Mirror

mirror 首先理解它,翻译过来就是“镜像”,而对应的应该意思就是“备份”;而在mvaen中,mirror除镜像的意思外,还应该理解它是一个代理仓库,或是一个“拦截器”,它会拦截maven对remote repository的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。

2.1 没有配置mirror:

Maven的repository介绍和 mirror设置_第1张图片

2.2 配置mirror:

Maven的repository介绍和 mirror设置_第2张图片

此时,B Repository被称为A Repository的镜像。

如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。换句话说,任何一个可以从仓库Y获得的构件,都胡够从它的镜像中获取。

2.3

标签里面放置的是要被镜像的Repository ID。为了满足一些复杂的需求,Maven还支持更高级的镜像配置:

* 
        匹配所有远程仓库。 

repo1,repo2 
        匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。 

*,!repo1  
        匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。 

3 Repository与Mirror

3.1 定义

其实,mirror表示的是两个Repository之间的关系,在maven配置文件(setting.xml)里配置 了…, 即定义了两个Repository之间的镜像关系。

3.2 配置mirror的目的

配置两个Repository之间的镜像关系,一般是出于访问速度和下载速度考虑。

example 1:

Maven的repository介绍和 mirror设置_第3张图片

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中的即可。

这里会涉及几个点:

  1. 在同一个pom.xml中,要配置俩个远程库 ,分别为 A 和 B
  2. 那么,默认应该会有A和B库的优先级设置问题,同时应该要考虑A、B和center库的同步机制(思路:默认公司访问A库–>访问B–>默认center库,默认期初A库和B库为空,每次资源可能从center库拿,拿到后,是否会同时copy到A库和B库,如时同时要copy到A库和B库,效率要低,但如果只是copy到A库,在住所编码时,设置了B为A的镜像,默认从B拿,但B没有,还要请求A,所以第一次效率也并不高)
  3. 另外,不同库要进行用户校验,本人暂未涉及

3.3 注意

需要注意的是,由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定或者停止服务的时候,Maven仍将无法访问被镜像仓库,因而将无法下载构件。


4 私服

私服是一种特殊的远程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


Maven的repository介绍和 mirror设置_第4张图片

你可能感兴趣的:(maven)