一、什么是仓库
任何一个依赖、插件或项目构件的输出,都可以称为构件。任何一个构件都有一组坐标唯一标识。
Maven可以在某一个位置统一存储所有Maven项目共享的构件,这个统一位置就是仓库。
为了实现重用,项目构建完毕后生成的构件也可以安装或部署到仓库。
二、仓库的布局
任何一个构件都有唯一坐标,根据这个坐标可以定义其在仓库中的唯一存储路径,这就是Maven仓库的布局方式。
Maven仓库是基于简单文件系统存储的。
三、仓库的分类
分为两类:本地仓库和远程仓库。
当Maven工具左边寻找构件时,首先查看本地仓库,若有则直接使用;若不存在此构件,或需要查看是否有更新的构件版本,Maven就会去远程仓库查找,发现所需构件后,下载到本地仓库再使用。如果本地仓库和远程仓库都没有,就会报错。
中央仓库是Maven核心自带的远程仓库,包含了绝大部分的开源构件。
私服是另一种特殊远程仓库。
其他公开的远程仓库常见的有Java.net Maven和JBoss Maven等。
1.本地仓库
一般来说,在Maven项目目录下,没有诸如lib/这样用来存放依赖文件的目录。当Maven在执行编译或测试时,如果需要依赖文件,总是基于坐标使用本地仓库的依赖文件。
默认情况下,每个用户在自己的目录下都有一个路径名为.m2/repository的仓库目录。
自定义本地仓库目录地址,可以编辑文件**~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址。例如:
<settings>
<localRepository>D:....</localRepository>
</settings>
默认情况下,~/.m2/setting.xml不存在,用户需要从安装目录复制$M2_HOME/conf/settings.xml文件再进行编辑。
构件进入本地仓库的两种方式:
- 依赖Maven从远程仓库下载到本地仓库
- 将本地项目构件安装到Maven仓库中——mvn install。
2.远程仓库
安装好Maven后,如果不执行任何Maven命令,本地仓库目录是不存在的。
每个用户只有一个本地仓库,可以配置访问多个远程仓库。
3.中央仓库
中央仓库是默认的远程仓库。可以使用解压打开jar文件$M2_HOME/lib/maven-model-builder-3.0.jar,然后访问路径org/apache/maven/model/pom-4.0.0.xml,可以看到以下配置:
<repositories>
<repository>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
包含这段配置的文件是所有Maven项目都会继承的超级POM。使用id central对中央仓库进行唯一标识,使用default仓库布局。snapshots元素的子元素enabled值为false,表示不从中央仓库下载快照版本的构件。
4.私服
架设在局域网内的仓库服务,供局域网内Maven用户使用。
私服用途
优点是:
- 节省带宽
- 加速Maven构件
- 部署第三方构件
- 提高稳定性,增强控制
- 降低中央仓库负荷
四、远程仓库配置
在POM中配置远程仓库:
<project>
...
<repositories>
<repository>
<id>jboss</d>
<name>JBoss Repository</name>
<url>xxxxx</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<layout>default</layout>
</repository>
<repositories>
...
</project>
可以使用repository声明多个远程仓库。这里releases的enabled开启了JBoss仓库发布版本下载支持,而snapshots的enabled值为false则关闭了快照版本下载支持。
对于releases和snapshots来说,还包含另外两个子元素updatePolicy和checksumPolicy。
updatePolicy用来配置Maven从远程仓库检查更新的频率,默认daily。其他值还有:never,always,interval:X(每X分钟检查一次更新)。
checksumPolicy配置检查校验和文件的策略。当构件被部署到Maven仓库时,同时部署对应的校验和文件。在下载构件时,会验证校验和文件。当checksumPolicy的值为默认的warn时,Maven会在执行构件时输出警告,其他值:fail,ignore。
1.远程仓库认证
有些远程仓库需要认证才能访问。配置认证信息和配置仓库信息不同,认证信息必须配置在settings.xml文件中,因为settings.xml一般只放在本机,较为安全。例子:
<settings>
...
<servers>
<server>
<id>my-pro</id>
<username>repo-user</username>
<password>pwd</password>
</server>
</servers>
...
</settings>
settings.xml的server元素的id必须与POM中需要认证的repository元素id完全一致。
2.部署至远程仓库
首先需要编辑项目的pom.xml文件。配置distributionManagement元素:
<project>
...
<distributionManagement>
<repository>
<id>pro-rel</id>
<name>pro xxx</name>
<url>xxxxxx</url>
<snapshotRepository>
<id>pro-snapshots</id>
<name>pro snapshot repo</name>
<url>xxxxx</url>
</snapshotRepository>
</distributionManagement>
...
</project>
配置正确后,运行mvn clean deploy。
五、快照版本
快照版本机制为了解决多人开发中遇到的相关问题。快照版本只应该在组织内部的项目或模块间依赖使用。
六、从仓库解析依赖机制
1.当依赖范围是system时,Maven直接从本地文件系统解析构件。
2.根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,若发现相应构件则解析成功。
3.在本地仓库不存在相应构件时,若依赖版本是显式的发布版本构件,则遍历所有远程仓库,发现并下载。
4.若依赖版本是RELEASE或LATEST,则基于更新策略读取所有远程仓库元数据,将其与本地仓库的对应元数据合并后,得到最新快照版本值,然后基于该值检查本地仓库或远程仓库。
5.如果依赖版本是SNAPSHOT
,则基于更新策略读取所有远程仓库的元数据,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后基于该值检测本地仓库,或从远程仓库下载。
6.如果最后解析得到的构件版本是时间戳格式的快照,则复制其时间戳格式的文件至非时间戳格式,并使用该非时间戳格式构件。
当依赖版本不明晰时,如RELEASE、LATEST、SNAPSHOT,Maven需要基于更新远程仓库的更新策略来检测更新。
在前面的第四大点的仓库配置中,有些配置与此有关:首先是<release><enabled>和<snapshot><emabled>,只有仓库开启了对于发布版本的支持时,才能访问该仓库的发布版本构件信息,对于快照版本也是同理;
其次注意<release>和<snapshot>子元素<updatePolicy>配置的更新频率。用户还可以从命令行加入参数-U,强制检测更新,使用参数后Maven会忽略<updatePolicy>配置。
当Maven检查完更新策略,并决定检查依赖更新时,需要检查仓库元数据maven-metadata.xml。
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus</artifactId>
<versioning>
<latest>1.4.2-snapshot</latest>
<release>1.4.0</release>
<versions>
<version>1.3.5</version>
<version>1.3.6</version>
<version>1.4.0-snapshot</version>
<version>1.4.0.1-snapshot</version>
<version>1.4.1-snapshot</version>
<version>1.4.2-snapshot</version>
</versions>
<latestUpdated>200091214221557</latestUpdated>
</versioning>
</metadata>
该文件列出仓库存在该构建的可用版本,同时latest元素执行最新版本。
当依赖版本设置为快照版本时,Maven也需要检查更新。
七、镜像
如果仓库X可以提供仓库Y的所有存储内容,那么就可以认为X是Y的一个镜像。可以配置Maven使用镜像代替中央仓库。编辑settings.xml:
<settings>
....
<mirrors>
<mirror>
<id>xxx</id>
<name>xxxx</name>
<url>xxxx</url>
<mirrorOf>central</mirrrorOf>
</mirror>
</mirrors>
....
</settings>
<mirrorOf>值为central,表示配置中央仓库的镜像。值为*则是所有Maven仓库的镜像。若需要认证,则配置<server>,详细见5.4。
高级镜像配置:
- <mirrorOf>external:*</mirror>:匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。即所有不是本机上的远程仓库。
- <mirrorOf>repo1,repo2</mirrorOf>:匹配repo1,repo2
- <mirrorOf>*,! repo1</mirrorOf>:匹配所有远程仓库,除了repo1。
八、仓库搜索服务
使用仓库搜索服务根据关键字得到Maven坐标。
1.Sonatype Nexus
地址:http://repository.sonatype.org/
2.Jarvana
地址:http://www.jarvana.com/jarvana/
3.MVNbrowser
地址:http://www.mvnbrowser.com
4.MVNrepository
地址:http://mvnrepository.com/
网友评论