Maven的远程仓库配置说明

   在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。

Maven 仓库有三种类型:

  • 本地仓库(local):Maven 的本地仓库,在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
  • 中央仓库(central):Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。一般来说,简单的Java项目依赖的构件都可以在这里下载到,这个仓库由 Maven 社区管理,中央仓库包含了绝大多数流行的开源Java构件,不过国内访问太慢。
  • 远程仓库(remote):如果 Maven 在中央仓库中也找不到依赖的文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库(也就是自己公司搭建的私服),包含了所需要的代码库或者其他工程中用到的 jar 文件。

Maven 依赖仓库搜索顺序

当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:

  • 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
  • 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
  • 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
  • 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。

备注:Maven 中央仓库默认在国外, 目前国内使用很慢,Maven源码中默认是访问中央仓库,所以国常使用镜像,来完成jat包的依赖,最直接的方式在Settings.xml中设置mirror ,使用阿里等一些国内主流的镜像仓库替代远程中央镜像。

Maven仓库配置方式

第一种场景:个人开发,直接使用国内镜像仓库替换Maven中央仓库,操作比较简单,直接在Maven安装目录的settings.xml文件中进行全局配置即可,以阿里云的镜像为例:




    
        
        alimaven   
        
        阿里云仓库地址 
        
        http://maven.aliyun.com/nexus/content/groups/public/
        central
    

说明:central其实为Maven中央仓库的标识,Maven源码内默认的是中央仓库地址,这段配置的意思可以理解为替换Maven中央仓库地址为阿里云仓库。mirrorOf主要的作用可以理解为拦截,覆盖并重定向新的指定的url镜像仓库地址。
第二种场景:公司开发,一般公司都会使用nexus搭建自己的私有仓库,它极大的简化了本地内部仓库的维护和外部仓库的访问。毕竟有些涉及到自研发的jar包,这部分jar只是公司内部研发,拱各个项目组共同使用,这种也比较简单。

附带个私服仓库的工作流程


    
        
        xiaoyaziyun   
        
        小鸭子公司私有仓库地址 
        
        http://maven.aliyun.com/nexus/content/groups/public/
        
        central
    

参考:使用Nexus搭建Maven私服
第三种场景: 项目配置公司私服,并且配置国内镜像仓库地址。
这个得先按照配置第一场景,配置Settings.xml,然后在项目总pom.xml中增加以下配置:


        
            
            nexus
            
            Team Nexus Repository
            
            http://xiaoyaziyun.com:8081/nexus/content/groups/public
        
 

mirror和repository的关系、区别

要分清楚mirrorepository关系、区别,要先知道Maven在下载依赖jar包时,读取配置文件顺序:
一个java项目通过Maven自动下载依赖时,会读取三个配置文件,分别是:

  1. 项目下pom.xml文件中配置,多个repository时,按照从上往下的顺序读取配置。
  2. 用户录下的.m2/settings.xml内的(.m2它是在第一次执行 maven 命令的时候才被创建,不过一般开发都会自定义路径,可忽略)。
  3. Maven安装目录 /conf文件夹下的,全局配置settings.xml(重要)。
    三者的级先是 pom.xml >/用户/.m2/settings.xml>/maven安装目录/conf/settings.xml ,如果要设置全局Maven仓库配置,需要在Maven安装目录/conf下找到settings.xml来修改。

上面也提到mirror相当于一个拦截器,它会拦截Maven对remote repository(远程仓库)的相关请求,把请求里的remote repository地址,重定向到mirror里配置的地址。这个拦截的就是pom.xml中设置的配置
1、在mirrorOfrepository中的Id相同的时,优先是使用mirror的地址。
2、当mirrorOf配置为*(通配符)的时,就是拦截所有repository配置。
3、存在多个mirror配置的时候mirrorOf等于*放到最后,但是官网给的说法是,当配置多个mirror时,只有第一个生效,但是我自己项目测试时候,配置多个时候,还是有影响的,懒得细查了。
4、只配置mirrorOf为central的时候可以不用配置repository

mirrorOf标签还支持更高级的镜像配置:

配置方式 作用描述
external:* 表示不在本地仓库的文件才从重定向的镜像仓库获取
repo,repo1 表示拦截远程仓库 repo 和 repo1访问,重定向到指定url镜像仓库获取
*,!repo1 表示所有远程仓库都从指定url镜像仓库获取,除 repo1 远程仓库以外
* 表示所用远程仓库都从指定url镜像仓库获取

总结:Maven获取pom.xml里的repository集合,然后在settings.xml里找mirrors元素,如果repositoryidmirror的mirrorOf的值相同,则该mirror替代该repository,如果该repository找不到对应的mirror,则使用其本身指定的仓库地址,依此可以得到最终起作用的远程仓库集合。
仓库优先级
本地仓库 > 私服 (profile)> 远程仓库(repository)和 镜像 (mirror) > 中央仓库 (central)

Maven的settings.xml文件里面不仅有mirror,还有proxyserverrepository`的配置,在配置仓库地址的时候容易混淆:

  • proxy是服务器不能直接访问外网时需要设置的代理服务,不常用。
  • serve是服务器要打包上传到私服时,设置私服的鉴权信息,如本地的jar包上传到私服,就要在这里设置密码。
  • profiles 上面提到mirror,配置多个只会一个有效,如果需要多仓库配置,可以在profiles节点下配置多个profile,但是配置需要激活,特别麻烦,也不常用。
  • mirror 是用于拦截并替代指定id镜像地址。

总结: 在有私服的情况下,最好是直接在Setings设置全局拦截,把所有的仓库指向公司的私服,因为nexus也会配置国内镜像地址,当jar不存在是,它会连接外网进行下载,也就是按照第一场景设置。

你可能感兴趣的:(Maven的远程仓库配置说明)