一、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/