任何一个构建都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径,这便是Maven的仓库布局方式。
仓库的分类
1.本地仓库:首先查看这个仓库,存在构件直接使用(默认情况下在用户目录的.m2/repositiory/下)
自定义本地仓库目录地址:
<settings>
<localRepository>自定义的目录</localRepository>
</settings>
2.远程仓库:构件不存在或者查看是否有新版本,去这个仓库查看
Tips:如果2个仓库都没有就会报错
远程仓库:
远程仓库的配置
默认的中央仓库无法满足项目的需求,可能项目需要的构建存在于另外一个远程仓库(如JBoss Maven库),具体配置如下:
<project>
...
<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>
...
</project>
任何一个仓库声明的id必须是唯一的,Maven自带的仓库id为central,仓库同名,将会覆盖
releases控制Maven对发布版本构件的下载
snapshots控制Maven对快照版本构件的下载
这2个元素有3个子元素:enabled、updatePolicy(从远程仓库更新的频率默认为daily;never、always、interval:X分钟)、checksumPolicy(校验和,warn发出警告,fail失败,ignore忽略)
远程仓库的认证
配置认证信息和配置仓库信息不同,仓库信息可以直接配置在POM文件中,但是认证信息必须配置在settings.xml文件中
【因为一般POM被提交到代码仓库中,供所有成员访问,settings.xml一般只放在本机,更为安全】
配置代码如下:
<settings>
...
<servers>
<server>
<id>my</id>
<username>repo-user</username>
<password>repo-pwd</password>
</server>
</servers>
...
</settings>
Tips:这里的关键是*id元素,settings.xml中server元素的id必须与POM中需要认证的repository元素的id完全一致*
部署至远程仓库
在项目的pom.xml文件中进行配置distributionManagement元素,代码如下:
<project>
...
<distributeManagement>
<repository>
<id>proj-releases</id>
<name>PRroj Releases Repository</name>
<url>仓库的地址</url>
<snapshotRepoository>
<id>proj-snapshots</id>
<name>PRroj Snapshots Repository</name>
<url>仓库的地址</url>
</snapshotRepoository>
<layout>default</layout>
</repository>
</distributeManagement>
...
</project>
其中repository元素表示发布版本构件的仓库,snapshotRepoository元素表示快照版本的仓库,id元素是仓库的唯一标识
Tips:往远程仓库部署构建的时候,往往需要认证
命令 mvn clean deploy
会将项目构建输出的够将部署到配置对应的远程仓库
快照版本
快照版本只应该在组织内部的项目或模块间依赖使用,因为这时组织对这些快照版本的依赖具有完全的理解及控制权
从仓库解析依赖的机制
当本地仓库没有依赖构件的时候,Maven会自动从远程仓库下载:当依赖版本为快照版本的时候,Maven会自动找到最新的快照,这背后的依赖解析机制如下:
- 当依赖的范围是system的时候,Maven直接从本地文件系统解析构件
- 根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件,则解析成功
- 在本地仓库不存在相应构件的情况下,如果依赖版本是显示的发布版本构件,则遍历所以远程仓库,发现后,下载并解析使用
- 如果依赖版本是RELEASE或者LATEST,则基于更新策略读取所以远程仓库的元数据
groupId/artifactId/maven-metadata.xml
,将其与本地仓库的对应元数据合并后,计算出RELEASE或者LATEST的真实值,然后基于这个真实值检查本地和远程仓库,步骤如2 3 - 如果依赖的版本是SNAPSHOT,则基于更新策略读取所以远程仓库的元数据
groupId/artifactId/version/maven-metadata.xml
,将其与本地仓库的对应元数据合并后,得出最新的快照版本的值,然后基于这个值检查本地和远程仓库,步骤如2 3 - 如果最后解析到的构件版本是时间戳格式的快照,则复制其时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用该非时间戳格式
镜像
如果仓库X可以提供仓库Y存储的所有内容,那么X就是Y的镜像,http://maven.net.cn/context/groups/public/是中央仓库http://repo1.maven.org/maven2/在中国的镜像
配置镜像需要编辑settings.xml文件,如下:
<settings>
...
<mirrors>
<mirror>
<id>maven.net.cn</id>
<name>one of the central mirrirs in China</name>
<url>http://maven.net.cn/context/groups/public/</url>
<mirrorof>central</mirrorof>
</mirror>
</mirrors>
...
</settings>
mirrorof元素的值为central,表示任何对中央仓库的访问请求都会转到该镜像
配置镜像的几种方式:
<mirrorof>*</mirrorof>:
匹配所有远程仓库<mirrorof>external:*</mirrorof>:
匹配所有远程仓库,使用localhost的除外,使用file://协议的除外(匹配所有不在本机的仓库)<mirrorof>repo1,repo2</mirrorof>:
匹配仓库repo1,repo2(使用都好分割多个远程仓库)<mirrorof>*,!repo1</mirrorof>:
匹配所有远程仓库,repo1除外(使用感叹号将仓库从匹配中排除)
仓库搜索服务
Sonatype Nexus:地址:http://repository.sonatype.org/
Jarvana:地址:http://www.jarvana.com/jarvana/
MVNbrowser:地址:http://www.mvnbrowser.com/
MVNrepository:地址:http://mvnrepository.com/