Maven仓库

maven仓库分类:

  本地仓库(也就是.m2文件夹下的):本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果你所需要的jar包版本在本地仓库没有,而且也不存在于远程仓库,Maven在构建的时候会报错,这种情况可能发生在有些jar包的新版本没有在Maven仓库中及时更新。

<settings>   
   <localRepository>D:/m2/repository</localRepository>  
</settings>   
    缺省默认地址:${user.home}/.m2/repository

  远程仓库,除了本地仓库都是远程仓库

     1、中央仓库,中央仓库默认就是告诉Maven从外网的哪个地方下载jar包。Maven的安装目录中,在lib目录下,maven-model-builder-3.1.0.jar中,有一个默认的pom.xml文件。其中就配置了Maven默认连接的中心仓库

       默认仓库地址是:https://repo.maven.apache.org/maven2/,可以通过修改/conf/settings.xml文件来修改默认的中央仓库地址

<profile> 
    <id>repository-profile</id> 
    <repositories>
         <repository> 
            <id>central</id> 
            <name>Central Repository</name>
            <layout>default</layout>                  
            <url>
                http://maven.aliyun.com/nexus/content/groups/public
            </url> 
            <snapshots> 
                <enabled>true</enabled>
            </snapshots> 
            <releases> 
                <enabled>true</enabled> 
            </releases> 
          </repository> 
    </repositories> 
</profile>
                                     

 

     2、私服仓库(可以是自己创建的,也可以是其他主体创建的(例如阿里云的maven仓库,jBoss的maven仓库))

 

 

Maven 依赖搜索顺序

    1、在本地仓库中寻找,如果没有是默认进入中央仓库查找,要进私服仓库需要/conf/settings配置或者在maven项目的pom文件中配置。

        一般中央仓库会 修改为国内仓库地址(因为国外地址太慢),或者设置一个镜像仓库

    2、在全局应用的私服仓库中寻找,如果没有则进入下一步。 

    3、在项目自身的私服仓库中寻找,如果没有则进入下一步。 

    4、在中央仓库中寻找,如果没有则终止寻找。

            以上换句话说就是:本地仓库->profile->pom中的repository ->mirror/中央仓库

    1. 如果在找寻的过程中,如果发现该仓库有镜像设置,则用镜像的地址代替。 
    2. 如果仓库的id设置成“central”,则该配置会覆盖maven默认的中央仓库配置。

  默认情况下,Maven下载jar包将直接连接到中央仓库即默认的http://repo1.maven.org/maven2/去下载;如果想设置本地先进私服,两种配置方法:

    /conf/settings配置 或者 在 maven项目的pom文件中配置

  <profile>
      <id>default</id>
      <repositories>
        <repository>
          <id>nexus</id>
          <name>local private nexus</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>nexus</id>
          <name>local private nexus</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
   </profile>

 

 

Maven镜像:

  maven默认的中央仓库速度很慢,可以镜像一个阿里云的仓库,有如下两种方式:

    1、针对所有项目修改中央仓库

      settings.xml里配置mirrors

<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>

     2、分别给每个不同的项目配置中央仓库

      在maven项目的pom.xml里配置如下:

<repositories>  
        <repository>  
            <id>alimaven</id>  
            <name>aliyun maven</name>  
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
            <releases>  
                <enabled>true</enabled>  
            </releases>  
            <snapshots>  
                <enabled>false</enabled>  
            </snapshots>  
        </repository>  
</repositories>

 

 

 

关于镜像仓库备注:

  1.<mirrorOf>*</mirrorOf> 
    匹配所有远程仓库。这样所有pom中定义的仓库都不生效
  2.<mirrorOf>external:*</mirrorOf> 
    匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。 
  3.<mirrorOf>repo1,repo2</mirrorOf> 
    匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。 
  4.<mirrorOf>*,!repo1</miiroOf> 
    匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除。
 
mirrors可以配置多个mirror,每个mirror有id,name,url,mirrorOf属性,id是唯一标识一个mirror就不多说了,name貌似没多大用,相当于描述,url是官方的库地址,mirrorOf代表了一个镜像的替代位置,例如central就表示代替官方的中央库。

    我本以为镜像库是一个分库的概念,就是说当a.jar在第一个mirror中不存在的时候,maven会去第二个mirror中查询下载。但事实却不是这样,当第一个mirror中不存在a.jar的时候,并不会去第二个mirror中查找,甚至于,maven根本不会去其他的mirror地址查询。后来终于知道,maven的mirror是镜像,而不是“分库”,只有当前一个mirror无法连接的时候,才会去找后一个,类似于备份和容灾。

    还有,mirror也不是按settings.xml中写的那样的顺序来查询的。所谓的第一个并不一定是最上面的那个。

    当有id为B,A,C的顺序的mirror在mirrors节点中,maven会根据字母排序来指定第一个,所以不管怎么排列,一定会找到A这个mirror来进行查找,当A无法连接,出现意外的情况下,才会去B查询。

 

 

 

 
posted @ 2019-10-12 15:39  但偏偏  阅读(492)  评论(0编辑  收藏  举报