Maven之(五)Maven仓库

本地仓库

Maven一个很突出的功能就是jar包管理,一旦工程需要依赖哪些jar包,只需要在Maven的pom.xml配置一下,该jar包就会自动引入工程目录。初次听来会觉得很神奇,下面我们来探究一下它的实现原理。

首先,这些jar包肯定不是没爹没娘的孩子,它们有来处,也有去处。集中存储这些jar包(还有插件等)的地方被称之为仓库(Repository)。

不管这些jar包从哪里来的,必须存储在自己的电脑里之后,你的工程才能引用它们。类似于电脑里有个客栈,专门款待这些远道而来的客人,这个客栈就叫做本地仓库

比如,工程中需要依赖spring-core这个jar包,在pom.xml中声明之后,maven会首先在本地仓库中找,如果找到了很好办,自动引入工程的依赖lib库即可。可是,万一找不到呢际上这种情况经常发生,尤其初次使用maven的时候,本地仓库肯定是空无一物的,这时候就要靠maven大展神通,去远程仓库去下载。

远程仓库

说到远程仓库,先从最核心的中央仓库开始,中央仓库是默认的远程仓库,maven在安装的时候,自带的默认中央仓库地址为http://repo1.maven.org/maven2/,此仓库由Maven社区管理,包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。Maven社区提供了一个中央仓库的搜索地址:http://search.maven.org/#browse,可以查询到所有可用的库文件。

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

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

实际开发中,一般不会使用maven默认的中央仓库,现在业界使用最广泛的仓库地址为: http://mvnrepository.com/,比默认的中央仓库更快、更全、更稳定,谁用谁知道。

下面就是spring-core的最新版本在该仓库的信息:

Maven之(五)Maven仓库

Maven私服有很多好处:

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

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

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

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

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

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

Maven之(五)Maven仓库
  1. mirrors>  
  2. mirror>  
  3.          
  4.        id>nexusid>  
  5.          
  6.        name>Human Readable Name name>  
  7.          
  8.        mirrorOf>*mirrorOf>  
  9.          
  10.        url>http://192.168.0.1:8081/nexus/content/groups/public/url>  
  11. mirror>  
  12. mirrors>  

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

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

2、设置远程仓库

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

[html] view plain copy

  1. repositories>  
  2. repository>  
  3.       
  4.      
  5.   id>repoId id>  
  6.       
  7.      
  8.   name>repoNamename>  
  9.       
  10.   
  11.   url>http://……url>  
  12.    
  13.      
  14.   releases>  
  15.         
  16.         
  17.     enabled>falseenabled>  
  18.         
  19.         
  20.         
  21.     updatePolicy>alwaysupdatePolicy>  
  22.         
  23.         
  24.         
  25.     checksumPolicy>warnchecksumPolicy>  
  26.            
  27.   releases>  
  28.       
  29.      
  30.   snapshots>       
  31.     enabled/>  
  32.     updatePolicy/>  
  33.     checksumPolicy/>        
  34.   snapshots>  
  35.         
  36. repository>      
  37. repositories>  

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

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

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

[html] view plain copy

  1. pluginRepositories>  
  2.       pluginRepository>  
  3.    
  4.              id />  
  5.              name />  
  6.              url />  
  7.    
  8.              releases>  
  9.                     enabled />  
  10.                     updatePolicy />  
  11.                     checksumPolicy />  
  12.              releases>  
  13.                     
  14.              snapshots>  
  15.                     enabled />  
  16.                     updatePolicy />  
  17.                     checksumPolicy />  
  18.              snapshots>       
  19.    
  20.       pluginRepository>               
  21. pluginRepositories>  

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

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

3、设置发布权限

私服的作用除了可以给全公司的人提供maven构件的下载,还有一个非常重要的功能,就是开发者之间的资源共享。

一个大的项目往往是分模块进行开发的,各个模块之间存在依赖关系,比如一个交易系统,分为下单模块、支付模块、购物车模块等。现在开发下单模块的同学需要调用支付模块中的接口来完成支付功能,就需要将支付模块的某些jar包引入本地工程,才能调用它的接口;同时,开发购物车模块的同学需要调用下单模块的接口,来完成下单功能,他就需要依赖下单模块的某些jar包。这三个模块都在持续开发中,不可能将各自的源码传来传去支持对方的依赖。

解决的方式是这样,每个模块完成了某个阶段性的功能,都会将提供对外服务的接口打成jar包,传到公司的私服当中,谁要使用该模块的功能,只需要在pom.xml文件中声明一下,maven就会像下载其他jar包那样把它引入你的工程。

在开发过程中,在pom中声明的构件版本一般是快照版:

[html] view plain copy

  1. dependency>  
  2.       groupId>com.yourCompany.tradegroupId>  
  3.       artifactId>trade-payartifactId>  
  4.       version>1.0.2-SNAPSHOTversion>  
  5. dependency>  

各个模块会不断的上传新的jar包,如果本地项目依赖的是快照版,那么maven一旦发现该jar包有新的发布,就会将它下载下来替代以前的旧版本。比如,支付模块在测试的时候发现有个bug,修复了一下,然后将快照版发布到私服。而你只需要专注于下单模块的开发,所依赖的支付模块的更新由maven处理,不需要关心。一旦你开发的模块修复了一个bug,或者添加了一个新功能等修改,只需要将发布一次快照版本到私服即可,谁需要依赖你的接口谁自然会去私服下载,你也不用关心。

一般私服建立完毕之后不需要认证就可以访问,但是风险有多大,可以自己想象,比如有天女秘书不小心把她跟老板的艳照传到了私服,开发的同学就没心思干活了吧……所以私服的权限设置还是很有必要的。

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

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

Maven之(五)Maven仓库

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

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

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

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

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树Java概览Maven基础91338 人正在系统学习中

来源:Franco蜡笔小强

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年10月6日
下一篇 2017年10月6日

相关推荐