05_Maven核心_仓库

通过配置项目的POM文件,Maven就可以帮助我们构建相应的jar包依赖,编译等等。

这节描述一下项目是在哪个地方下载构件的

PS:构建:在Maven世界中,任何一个依赖、插件、或者项目构建的输出都叫做一个构件。

一、Maven仓库定义

Maven可以在某个位置统一存储多有Maven项目共享的构件,这个统一的位置就是仓库。

类似于一个数据库(仓库),只有你有某条记录的ID(构件的坐标:groupId:artifactId:version),你就可以取到这条记录的所有数据(构件)

二、仓库的分类


1.本地仓库

含义:放在本机上的仓库。

我们使用Maven建立的项目中没有lib文件夹存放项目,这样也就避免的N个项目需要复制N份lib包的依赖。Maven通过本地仓库,将每一个构件只下载一份保存在本地仓库,N个项目中如果需要使用同样一个构件,那么只要构件的坐标唯一,在本地仓库中就有唯一一份。

一般情况下本地仓库都是放在用户目录下,例如:如果主机名为:Administrator。那么本地仓库的目录为:C:\Users\Administrator\.m2\repository。当然你也可以自己配置这个目录。可以打开setting.xml文件。



在setting文件中<localRepository>元素就是用来配置本地仓库用的。你可以改为任意目录

如果配置好了,如果你的系统没有这个$USER_PATH\.m2\repository这个目录,你可以先新建一个,以后所有构建都会下载到这个目录下。

这个目录下的文件路径也是有规律的:

<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.1.0.Final</version>

我们看一下在这个pom文件增加一个对hibernate-core的依赖。对应到本地仓库中文件存放的目录:


 

2.远程仓库

构建不在本地的仓库,而是保存在网络上。  

Maven查找构件时会先查看本地仓库有没有所需要的构件,如果有直接引用。没有就会去远程仓库查找。这就好像家里的书房和书店类似。我需要某本书,首先会在自家的书房里面找,如果没有找到,那就去书店里面找。如果最后书店里面也没有找到,Maven就会报错。

2.1中央仓库

中央仓库是Maven默认的一个仓库。我们可以打开$MAVEN_HOME/lib/maven-model-builder-3.0.4.jar
里面有个超级POM,所有项目里面的POM都是继承这个超级POM,有点像多有的类都是继承自Object类一样。在这个POM里面有这样一段:



这就定义了一个中央仓库:central。在这个中央仓库中包含了世界上绝大多数流行的Java构件。这就是为什么我们直接安装好Maven,然后就可以使用。因为项目需要的依赖直接可以从这个中央仓库下载。这个里面的元素解释已经在前面关于POM的描述中都说过了。

<id>:为中央仓库设置名称,如果子POM覆盖这个ID,那么这个中央仓库将失效

<name>:为中央仓库起个名字

<url>:通过url来定位在哪里下载构建

<layout>:默认使用Maven2的默认布局

<snapshots>--><enabled>:是否下载快照版本的构建,这是是不下载快照版本

2.2私服

PS:每次一想到私服就想起初中那会玩《**》。一个区里面只有一把屠龙刀,而且要升到65级才能拿,如果看到那个大神拿着屠龙刀,简直就是碉堡了但是这种正服不是我们屌丝玩的起的,所以当时选择玩私服,还记得当时玩的英山**的私服,一出来就是65级,裁决,麻痹戒指,超爽!为什么会喜欢玩私服呢?因为私服确实有优势。

正如我们Maven中的私服一样。

私服的定义:

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

私服的优势:
节约外网带宽:有了私服,Maven下载就是在局域网中传递数据,减少带宽的消耗
部署第三方构件:有些构建因为一些原因你在外部仓库没有办法获得,这时可以将构件上传到私服上供Maven用户使用
提高稳定性,增强控制:由于是私服,你可以不受外部仓库影响
降低中央仓库的负荷:N个人去中央仓库下载那么请求N次,如果在N个人前面加一个私服,那么N次请求变成了一次。因为私服请求一次,后面N个人就都去请求私服了
远程仓库的配置:
在前面我们已经看到怎么配置一个中央仓库,现在在配置一个jboss的远程仓库

  <repositories>
  	<repository>
  		<id>JBoss</id>
  		<name>JBoss Repository</name>
  		<url>http://repository.jboss.com/maven2</url>
  		<releases>
  			<enabled>true</enabled>
  		</releases>
  		<snapshots>
  			<enabled>false</enabled>
  		</snapshots>
  		<layout>default</layout>
  	</repository>
  </repositories>
 
 
 

在repositories中可以定义多个repository。每一个repository都声明了一个远程仓库。

 

<releases>
  	<enabled>true</enabled>
</releases>

表示Maven开启jboss仓库的发行版下载支持,对快照版不支持,layout默认布局采用Maven2及Maven3的默认布局。

<snapshots>
  	<enabled>true</enabled>
  	<updatePolicy>daily</updatePolicy>
  	<checksumPolicy>ignore</checksumPolicy>
</snapshots>

 

updatePolicy表示更新频率,daily表示每天更新;never表示从不更新;always表示每次构建检查更新;interval:XXX表示每隔XXX分钟检查更新一次
checksumPolicy用来配置Maven检查校验和文件的策略。默认为war表示Maven会在执行构建时输出警告信息;fail表示遇到校验和错误是就停止构建;ignore表示忽略校验和错误

Maven请求构件的流程: