一、Maven世界中,任何一个依赖、插件或者项目构件的输出,都可以成为构件。
例如log4j-1.2.15.jar、maven-compiler-plugin-2.0.2.jar、以及las-im-basis-1.0.0-SNAPSHOT.jar都是一个构件。Maven可以在一个位置唯一管理所有maven项目共享的构件,这个位置就是仓库。
二、仓库布局,一个构件的位置为
groupId/artifactId/version/artifactId-version-[classifier].packing
三、仓库分类
[img]http://dl.iteye.com/upload/attachment/0084/5019/e6d691c6-ceef-311e-8674-bad96854e5d3.jpg[/img]
四、本地仓库一般位于用户目下的.m2/repository/,用户级别的settings.xml文件一般位于用户目下的.m2/下,修改本地仓库的位置,则在settings.xml中
<settings>
<localRepository>本地仓库位置</localRepository>
….
</settings>
安装好maven后,如果不执行任何maven命令,本地仓库目录是不存在的,当用户输入执行第一条maven命令后,本地仓库目录才创建。
五、中央仓库在maven安装目录下的lib的maven-model-builder-xx.jar中的org/apache/maven/model/pom-4.0.0.xml中定义的,所有的maven项目都会继承这个超级pom。
六、私服是一种特殊的远程仓库,是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的maven用户使用,例如XX公司的maven构件私服。
七、很多情况下,默认的中央仓库无法满足项目需求,需要额外配置一个或者多个其他的远程仓库,配置这些信息可以在pom文件中配置,也可以在settings.xml中的<profiles>中<profile>配置仓库信息,并且激活该profile.
在pom中配置仓库信息

<project> 

 …. 

 <repositories> 

 <repository> 

 <id>jboss</id> 

 <name>jboss repository</name> 

 <url>….</url> 

 <releases> 

 <enabled>true</enabled> 

 </releases> 

 <snapshots> 

 <enabled>true</enabled> 

 </snapshots> 

 <layout>default</layout> 

 </repository> 

 …… 

</project> 

如果id为central则覆盖了中央仓库 

Releases、snapshots元素控制maven对于发布版构件和快照版构件的下载,true代表可以下载,false代表不可以下载。除了enabled外,releases、snapshots还有其他元素,例如 

<snapshots> 

 <enabled>true</enabled> 

 <updatePolicy>daily</updatePolicy> 

 <checksumPolicy>ignore</checksumPolicy> 

</snapshots>


updatePolicy:默认值为daily,此外还有never、always(每次构建都更新)、interval:X(每隔X分钟更新一次);
checksumPolicy:用来配置maven检查校验和文件的策略。当构件被部署到maven仓库时,会同时部署对应的校验和文件。当下载时,maven会验证校验和文件,当验证失败,怎么办,checksumPolicy用来控制验证,默认为warn,执行构建时输出警告信息,此外还有ignore,忽略验证失败,fail,验证失败则构建也失败。
八、远程仓库认证
有的情况下,出于安全考虑,访问远程仓库需要认证,认证信息需要在settings.xml中配置

<settings> 

 …. 

 <servers> 

 <server> 

 <id>jboss</id> 

 <username>….</username> 

 <password>….</password> 

 <server> 

 <servers> 

….. 

<settings>


Id值需要与远程仓库的id一致。
九、部署构件至远程仓库
Mvn clean install将构件安装到本地仓库,当需要将构件部署至远程仓库时,配置pom如下:

<project> 

….. 

 <distributionManagement> 

 <repository> 

 <id>…</id> 

 <name>…</name> 

 <url>….</url> 

 </repository> 

 <snapshotRepository> 

 <id>…</id> 

 <name>…</name> 

 <url>….</url> 

 </snapshotRepository> 

 </distributionManagement> 

…. 

</project>


当部署至远程仓库时需要认证时,跟之前的一样,需要在settings.xml中配置。
配置好这些之后,运行mvn clean deploy即可
十、快照版本
快照代表着不稳定。
当本地仓库没有依赖的构件的时候,maven会自动从远程仓库下载,当依赖的构件是SNAPSHOT版本的时候,maven会自动找到最新的快照。背后的解析机制:
1、当依赖的范围为system时,maven直接从本地文件系统解析构件
2、根据依赖坐标计算仓库路径后,尝试直接从本地仓库解析构件,如果发现相应构件,则下载
3、在本地仓库如果没有发现相应的构件的情况下,如果所依赖的版本是显示的发布版本构件,如1.2、2.1-beta-1等,则遍布所有的远程仓库,发现后解析使用
4、如果所依赖的版本为RELEASES或者LATEST,则基于更新策略(updatePolicy)读取所有远程仓库的元数据groupId/artifactId/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASE或者LATEST真实的值,然后基于这个真实的值检查本地和远程仓库。
5、如果依赖的版本是SNAPSHOT版本,则基于更新策略(updatePolicy)读取所有远程仓库的元数据groupId/artifactId/version/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后基于这个真实的值检查本地或者远程仓库。
6、如果最后得到的构件版本是时间戳格式的快照,则复制其时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用该非时间戳格式的构件。
由于RELEASES或者LATEST容易带来一些问题,所以maven3不再支持在插件版本中使用LATEST和RELEASES,如果不设置插件的版本,其效果和RELEASES一样,maven会去解析最新的发布版的构件。
强制检查更新的命令 mvn clean install –U.
十一、镜像
如果仓库X提供了仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像,在settings.xml中配置镜像信息。

<settings> 

…. 

 <mirrors> 

 <mirror> 

 <id>…</id> 

 <name>…</name> 

 <url>….</url> 

 <mirrorOf>….</mirrorOf> 

 <mirror> 

 <mirrors> 

…. 

<settings>


mirrorOf的值即为仓库的id值,如果镜像仓库不稳定造成无法解析构件,则被镜像的仓库也不能访问到了。
十二、几个仓库搜索服务地址
http://repository.sonatype.org/ http://www/jarvana.com/jarvana http://www.mvnbrowser.com http://mvnrepository.com/