第五节:Maven仓库(上)

仓库的分类:本地仓库和远程仓库。
     当Maven需要构件的时候,会首先查看本地仓库,如果本地仓库有此构件,则直接使用;如果本地仓库没有,或者需要查看更新的构件版本,Maven就会从远处仓库查找,下载到本地后再使用。
     中央仓库是Maven核心自带的远程仓库,本地仓库默认是从中央仓库下载构件的。私服是另一种特殊的远程仓库,是在局域网内架设的一个私有的仓库服务器,用其代理所有对外部仓库的访问,内部的项目还能部署到私服上供其他项目使用。
     除了中央仓库和私服,还有很多其他公开的远程仓库。所以关系图如下:
本地仓库:默认情况下,不管是在window还会linux上,每个用户在自己的用户目录下都有一个路径名为./m2/respority/的仓库目录,这就是本地仓库的位置。
     用户也可以自定义本地仓库的目录地址,编辑./m2/settings.xml文件,设置localRepository元素的值为想要的仓库地址。
     我们通过man clean install指令将我们的自己编写的构件发布到本地仓库中供其他项目使用。
     对于Maven来说,每一个用户只有一个本地仓库,但可以配置访问很多远程仓库。

中央仓库:中央仓库是默认的远程仓库,包含了世界上绝大多数流行的开源Java构件,以及源码,作者信息,许可证信息等,一般来说,一个简单的Maven项目所需依赖的全部构件都可以从中央仓库下载到,

私服:一种特殊的远程仓库,他是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的Maven用户使用,当Maven需要下载构件的时候,他会从私服请求,如果私服中不存在此构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载提供请求,另外一些无法从外部仓库下载到的构件也能从本地上传到私服供大家一起使用。


     建立私服的好处:
  • 节省自己的外网带宽:对于一个有多个Maven用户的团队来说,建立私服后,对外的重复构件的下载得以消除,比如说一个构件A,团队有10个用户都需要将其下载到自己的本地仓库,没有私服的情况下,每个人都需要从外部仓库下载10次,但是如果建立了私服,只需要从外部仓库下载一次构件A到私服,用户就可以通过局域网高速下载构件,节省外网带宽。
  • 加速Maven的构建:Maven的一些内部机制,比如快照检查机制(就是指不稳定版本)会要求Maven在构建项目的时候不停检查远程仓库,以获取最新快照版本的构件,当项目配置了很多远程仓库或者很多快照版本的构件时,项目的构件速度会大大降低。使用私服时,Maven只需检查局域网内私服的数据(关于私服上构件版本的更新和维护是需要配置的,后面会介绍),构建的速度大大提升。
  • 部署第三方构件:当某个构件无法从外部仓库获得,或者由于一些版权因素无法发布到公共仓库的构件,或者是组织内部的私有构件,使用私服可以解决问题。
  • 提高稳定性,增强控制:Maven项目的构建高度依赖于远程仓库,因此一旦网络不稳定,Maven构建过程中可能出现下载构件失败导致项目构建的情况,使用私服后,即使没有网络,因为已经缓存了大量构件,项目构建仍可以正常进行。

远程仓库的配置:
     这里配置的我们下载构件的远程仓库,配置在项目的POM文件中,在repositories元素下,使用 repository元素声明一个或者多个远程仓库,repository下有几个元素:
  • id:任何一个仓库声明的id必需是唯一的,Maven自带的中央仓库使用的id为central,如果再声明一个id为central的远程仓库,就会覆盖中央仓库的配置。
  • url:仓库的地址。
  • releases:控制对发布版本的下载,由releases元素下的子元素<enabled>true/false</enabled>控制。
  • snapshots:控制对快照版本的下载,由releases元素下的子元素<enabled>true/false</enabled>控制。
     对于releases和snapshots元素来说,除了enabled,还包含其他两个子元素updatePolicychecksumPolicy
  • updatePolicy:配置Maven从远程仓库检查更新的频率,默认值为daily,表示每天检查一次,其他的值有:never-从不检查更新,always-每次构建的时候都检查更新,inteval : X 表示每隔X分钟就检查一下更新。
  • checksumPolicy:当构件部署到Maven仓库中时,同时会部署对应的校验和文件,在下载这些构件的时候,我们会检验校验和文件,如果校验和验证失败怎么办,当checksumPolicy设置为warn时,在构件项目的时候,会输出警告信息。其他的值有:fail-Maven遇到检验和错误就让构建失败,ignore-使Maven完全忽略检验和验证。
 

远程仓库的认证:
     出于安全考虑,我们有时候需要一些认证信息才能够访问远程仓库,配置认证信息跟配置远程仓库信息不同,仓库信息可以配置在POM文件中,而认证信息则必须配置在当前用户的settings.xml文件中,因为POM是和构件一起被发布到仓库供所有成员访问的,因此只有在本地的settings.xml文件中配置认证信息才更加安全。
     我们使用settings.xml文件中的servers元素以及server子元素来配置认证信息,主要是配置server下的几个子元素:
  • id:必须与POM中需要认证的respority元素的id完全一致,正是这个id才将认证信息与仓库配置连在了一起。
  • username:认证用户名
  • password:认证密码
         

部署至远程仓库:
     私服的另一大作用就是部署第三方构件,包括组织内部生成的构件,这里配置的是我们上传构件的远程仓库,当使用mvn clean deploy 命令时我们就会把项目构件部署到我们配置的远程仓库上,而使用mvn clean install命令时是把项目发布到本地的Maven仓库中。
     我们需要配置的是POM文件中的distributionManagement元素:
  • downloadUrl:一个URL,其他Maven项目可以通过该URL下载并引用当前Maven项目的构件。
  • status:这里的状态不要受到我们的设置,maven会自动设置project的状态,至今为止最经常的状态,意思是制品是从maven2 instance部署的,
  • repository:表示发布版本的仓库。其中repository元素下又有几个子元素
    • id:远程仓库的唯一标识。
    • name:为了方便人阅读。
    • url:远程仓库的地址。
  • snapshotRepository:表示快照版本的仓库。 其中snapshotRepository元素的子元素同上。
     当我们往远程仓库部署构件的时候,往往也需要认证,配置的方式如上,即在settings.xml文件中创建一个server元素,其id与仓库id匹配,其他配置如上。