Maven总结之仓库(八)

阿凡达2018-06-28 17:42

8. Maven 仓库

中央仓库、中央仓库的镜像仓库、其他公共仓库、私服都属于远程仓库的范畴。

如果maven没有在本地仓库找到想要的东西,就会自动去配置文件中指定的远程仓库寻找,找到后将它下载到你的本地仓库。如果连远程仓库都找不到想要的东西,maven很生气,累老子跑了一圈都没找到,肯定是你配置写错了,报错给你看。

8.1 Maven 本地仓库

仓库分为本地仓库和远程仓库,是依赖和插件的存储的地方,本地仓库是在自己电脑上,默认位置是${user.home}/.m2/repository,在pom.xml中声明之后,maven会首先在本地仓库中找,找到了,自动引入工程的依赖lib库即可。找不到需要去远程仓库查找。

8.2 Maven 远程仓库

远程仓库,先从最核心的中央仓库开始,中央仓库是默认的远程仓库,除了中央仓库,还有其它很多公共的远程仓库,如中央仓库的镜像仓库。全世界都从中央仓库请求资源,累死宝宝了,所以在世界各地还有很多中央仓库的镜像仓库。镜像仓库可以理解为仓库的副本,会从原仓库定期更新资源,以保持与原仓库的一致性。从仓库中可以找到的构件,从镜像仓库中也可以找到,直接访问镜像仓库,更快更稳定。

除此之外,还有很多各具特色的公共仓库,如果需要都可以在网上找到,比如Apache Snapshots仓库,包含了来自于Apache软件基金会的快照版本。

私服

一般来讲,公司都会通过自己的私有服务器在局域网内架设一个仓库代理。私服可以看作一种特殊的远程仓库,代理广域网上的远程仓库,供局域网内的Maven用户使用。当Maven需要下载构件的时候,先从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务

Maven私服有很多好处

  1. 可以把公司的私有jar包,以及无法从外部仓库下载到的构件上传到私服上,供公司内部使用;

  2. 节省自己的外网带宽:减少重复请求造成的外网带宽消耗;

  3. 加速Maven构建:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低;

  4. 提高稳定性,增强控制:Internet不稳定的时候,maven构建也会变的不稳定,一些私服软件还提供了其他的功能

当前主流的maven私服有Apache的Archiva、JFrog的Artifactory以及Sonatype的Nexus。

8.3 Maven 仓库配置

仓库配置要做两件事,一是告诉maven你的本地仓库在哪里,二是你的远程仓库在哪里。

setting.xml的第一个节点\就是配置本地仓库的地方,前文已经讲过多,这里不再赘述。

远程仓库比较复杂,因为会涉及很多附属特性。以Nexus为例,至于Nexus怎么部署,怎么维护仓库,作为开发人员是不需要关心的,只需要把Nexus私服的局域网地址写入maven的本地配置文件即可。具体的配置方法如下:

设置镜像

<mirrors>  
    <mirror>  
       <!--该镜像的唯一标识符。id用来区分不同的mirror元素。 -->  
       <id>nexus</id>  
       <!-- 镜像名,起注解作用,应做到见文知意。可以不配置  -->  
       <name>Human Readable Name </name>  
       <!--  所有仓库的构件都要从镜像下载  -->  
       <mirrorOf>*</mirrorOf>  
       <!-- 私服的局域网地址-->  
       <url>http://192.168.0.1:8081/nexus/content/groups/public/</url>  
    </mirror>  
</mirrors>

节点\下面可以配置多个镜像,\用于指明是哪个仓库的镜像,上例中使用通配符“*”表明该私服是所有仓库的镜像,不管本地使用了多少种远程仓库,需要下载构件时都会从私服请求。

如果只想将私服设置成某一个远程仓库的镜像,使用\指定该远程仓库的ID即可。

设置远程仓库

远程仓库的设置是在\节点下面:

<repositories>  
<repository>  

   <!--仓库唯一标识 -->  
  <id>repoId </id>  

   <!--远程仓库名称  -->  
  <name>repoName</name>  

    <!--远程仓库URL,如果该仓库配置了镜像,这里的URL就没有意义了,因为任何下载请求都会交由镜像仓库处理,前提是镜像(也就是设置好的私服)需要确保该远程仓库里的任何构件都能通过它下载到  -->  
  <url>http://……</url>  

   <!--如何处理远程仓库里发布版本的下载 -->  
  <releases>  

      <!--true或者false表示该仓库是否为下载某种类型构件(发布版,快照版)开启。   -->  
    <enabled>false</enabled>  

      <!-- 该元素指定更新发生的频率。Maven会比较本地POM和远程POM的时间戳。这里的选项是:-->  
      <!-- always(一直),daily(默认,每日),interval:X(这里X是以分钟为单位的时间间隔),或者never(从不)。  -->  
    <updatePolicy>always</updatePolicy>  

      <!--当Maven验证构件校验文件失败时该怎么做:-->  
      <!--ignore(忽略),fail(失败),或者warn(警告)。 -->  
    <checksumPolicy>warn</checksumPolicy>  

  </releases>  

   <!--如何处理远程仓库里快照版本的下载,与发布版的配置类似 -->  
  <snapshots>       
    <enabled/>  
    <updatePolicy/>  
    <checksumPolicy/>        
  </snapshots>  

</repository>      
</repositories>

可以配置多个远程仓库,用加以区分。

除此之外,还有一个与\并列存在\节点,用来配置插件的远程仓库。

仓库主要存储两种构件。第一种构件被用作其它构件的依赖,最常见的就是各类jar包。这是中央仓库中存储的大部分构件类型。另外一种构件类型是插件,Maven插件是一种特殊类型的构件。由于这个原因,插件仓库独立于其它仓库。\节点与\节点除了根节点的名字不一样,子元素的结构与配置方法完全一样:

<pluginRepositories>  
      <pluginRepository>  

             <id />  
             <name />  
             <url />  

             <releases>  
                    <enabled />  
                    <updatePolicy />  
                    <checksumPolicy />  
             </releases>  

             <snapshots>  
                    <enabled />  
                    <updatePolicy />  
                    <checksumPolicy />  
             </snapshots>       

      </pluginRepository>               
</pluginRepositories>

远程仓库有releases和snapshots两组配置,POM就可以在每个单独的仓库中,为每种类型的构件采取不同的策略。例如,有时候会只为开发目的开启对快照版本下载的支持,就需要把\中的\设为“false”,而\中的\设为“true”。

由于远程仓库的配置是挂在\节点下面,如果配置有多个\节点,那么就可能有多种远程仓库的设置方案,该方案是否生效是由它的父节点\是否被激活决定的。

8.4 Maven 仓库设置发布权限

前文中已经提过,并不会所有人都可以访问私服,需要进行认证才可以。

这时就需要使用setting.xml中的servers元素了。需要注意的是,配置私服的信息是在pom文件中,但是认证信息则是在setting.xml中,这是因为pom文件往往是被提交到代码仓库中供所有成员访问的,而setting.xml是存放在本地的,这样是安全的。

在settings.xml中,配置具有发布发布版本和快照版本权限的用户:

上面的id是server的id,不是用户登陆的id,该id与distributionManagement中repository元素的id相匹配。maven是根据pom中的repository和distributionManagement元素来找到匹配的发布地址:

注意:pom中的id必须与setting.xml中配置好的id一致。

然后运行maven clean deploy命令,将自己开发的构件部署在私服上供组织内其他用户使用(maven clean deploy和maven clean install的区别:deploy是将该构件部署在私服中,而install是将构件存入自己的本地仓库中)。

在这里有人可能会有一个疑问,所有的仓库设置不是已经在setting.xml中配置好了吗,为什么在pom的发布管理节点当中还要配置一个url?

Setting.xml中配置的是你从哪里下载构件,而这里配置的是你要将构件发布到哪里。有时候可能下载用的仓库与上传用的仓库是两个地址,但是绝大多数情况下,两者都是由私服充当,就是说两者是同一个地址。

Maven总结之入门指南(一)

Maven总结之生命周期(二)

Maven总结之插件管理(三)

Maven总结之Setting.xml配置文件解析(四)

Maven总结之Pom.xml解析(五)

Maven总结之约定大于配置(六)

Maven总结之命令(七)

Maven总结之依赖管理(九)

本文来自网易实践者社区,经作者王志泳 授权发布。