maven仓库(五)
坐标和依赖是任何一个构建在maven世界中的逻辑表示方式,而构件的物理表示方式是文件,maven通过仓库来统一管理这些文件。
1.何为maven仓库
在maven世界中,任何一个依赖、插件或者项目构建的输出,都可以称为构建,任何一个构建都有一组坐标唯一标识。
maven通过仓库的方式,把所有构件都统一放在一个统一管理的地方,每个构建都只有一个唯一的版本实体,maven可以通过坐标定位到每个构件,在使用的时候去仓库获取构件,而不用放在项目的lib目录下,就可以使用他们,为了实现重用,项目构建完毕后生成的构件,也可以安装或部署到仓库中,供其他项目使用。
2.仓库的布局
任何构件都有一个唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径,这便是maven的仓库布局方式,构件在仓库的存储方式与坐标的大致对应关系为:gruopid/artifactid/version/artifactid-version.packaging,如果有classifier则gruopid/artifactid/version/artifactid-version[-classifier].packaging,groupid为把“.”点分隔符转换为路径分隔符“/”。
3.仓库的分类
本地仓库:maven会在每个使用maven服务的用户本地维护一个目录,缓存我们所有使用过的构件,一个构件只有在本地仓库中存在,才可以提供给本地maven项目使用,本地仓库构件的来源为远程仓库下载或者本地项目输出构件的安装。
远程仓库:中央仓库(公网远程仓库,maven核心内置的远程仓库,默认在此仓库下载构件)、私服(内网远程仓库,此仓库代理所有远程仓库,也可以把我们自己的构件发布到私服),其他公共仓库。
当maven根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在次构件,则直接使用,如果本地仓库不存在此构件,或者需要查看构件是否有更新的构件版本,maven就会去远程仓库查找,发现需要的构件之后,下载到本地仓库在使用,如果本地仓库和远程仓库都没有需要的构件,则maven会报错。
私服的有点:
1.节省自己的外网带宽:对外的重复构件只会从公网下载一次。
2.加速maven构建:大量构件都有缓存,减少外网下载的时间消耗。
3.部署第三方构件:当我们使用公共仓库没有的构件的时候,我们可以找到构件并且部署到私服,比如oracle的数据库驱动、我们自己构建输出的构件。
4.提高稳定性,增强控制:比如网络不稳定的时候,由于找不到构件会导致构建失败,有私服的情况下,因为是走的局域网,所以不会影响项目的构建,并且私服还提供权限管理、发布/快照的区分等,管理员可以对仓库进行一些更高级的控制。
5.降低中央仓库的负荷:有了私服,相同的构件我们只需要在中央仓库下载一次,我们就可以长期使用而不需要重复去中央仓库下载。
4.远程仓库的配置
远程仓库的配置
pom文件中,在project标签下配置
该标签下可以配置多个远程仓库
<repositories>
<repository>
id必须是唯一的,不能和已定义的重复,maven中央仓库的id为central,如果其他仓库id使用这个id就会覆盖掉中央仓库的配置。
<id>jboss</id>
远程仓库名称,我们自定义
<name>Jboss Repository</name>
远程仓库地址
<url>http://repository.jboss.com/maven2/</url>
控制发布版构件的下载
<releases>
开启本仓库发布版本构件的下载支持
<enabled>true</enabled>
maven从远程仓库检查更新的频率,默认是daily
daily:表示maven每天检查一次
never:从不检查更新
always:每次构建都检查更新
interval:X 每隔X分钟检查一次更新 X为任意整数
使用-U参数可以强制检查更新,例如,mvn clean install-U
<updatePolicy>daily</updatePolicy>
用来配置maven检查检验和文件的策略,当构件部属到maven仓库时,会同时部署对应的校验和文件,在下载构件的时候,maven会验证校验和文件,如果验证和校验失败:
warn:maven会在构建的时候输出警告信息
fail: maven遇到校验和错误就让构建失败
ignore:maven完全忽略校验和错误
<checksumPolicy>warn</checksumPolicy>
</releases>
控制快照版构件的下载 快照版本对应了很多时间戳版本的构件
<snapshots>
关闭本仓库快照版本构件的下载支持
<enabled>false</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
仓库布局为默认布局(maven2、maven3的布局)
<layout>default</layout>
</repository>
</repositories>
远程仓库的认证
这是一个身份验证配置文件列表,可以配置多个server,由系统中使用的服务器id键入,只要maven必须与远程服务器建立连接,就可以使用身份验证配置文件。
<servers>
server指定在连接到特定服务器时使用的身份验证信息, 系统内的唯一名称(由下面的“id”属性引用)。
您应该指定用户名/密码或私钥/密码,因为这些组合是一起使用的。
<server>
远程仓库ID,POM中有定义
<id>jbossTest</id>
用户名
<username>root</username>
密码
<password>root123</password>
</server>
另一个示例,使用密钥进行身份验证。
<server>
<id>siteServer</id>
<privateKey>/path/to/private/key</privateKey>
<passphrase>密码,如果不使用,留空。</passphrase>
</server>
</servers>
部署至远程仓库
在pom中进行配置
生成构件部署到远程仓库的配置,mvn clean deploy
<distributionManagement>
<!--发布版本的构件仓库-->
<repository>
唯一标识,需要认证的话,也需要配置这个id的认证信息在settings servers
<id>proj-releases</id>
方便阅读的名称
<name>Proj Releases Repository</name>
仓库地址
<url>http://repository.jboss.com/maven2/proj-releases</url>
</repository>
快照版本的构件仓库
<snapshotRepository>
<id>proj-snapshots</id>
<name>Proj Snapshots Repository</name>
<url>http://repository.jboss.com/maven2/proj-snapshots</url>
</snapshotRepository>
</distributionManagement>
5.快照版本
在maven的世界中,任何一个项目或者构件都必须有自己的版本。
快照版本的特性是,正在开发的功能模块设置为快照版本,当有其他模块需要依赖这个模块的时候,由于快照版本的特性,我们可以在不更改版本的情况下,把修改的内容更新发布到私服上提供给相关项目使用,并且他们使用的时候也不需要修改版本,而得到的构件是最新的构件,快照版本的构件每次提交的时候会使用一个时间戳加部署次数的版本标识,这些信息会记录到快照版本的信息文件中,用于maven解析版本使用,如maven-metadata.xml,根据维护级别的不同,存放这个元数据文件的目录也不同。
6.从仓库解析依赖的机制
1.当依赖的范围是system的时候,maven直接从本地文件系统解析构件。
2.根据依赖坐标计算仓库路径后,尝试直接从本地仓库寻找构件,如果发现相应构件则解析成功。
3.在本地仓库不存在相应构件的情况下,如果依赖的版本是发布版本的构件,则遍历所有的远程仓库,发现后下载并解析使用。
4.如果依赖的版本是RELEASE或者LATEST,则基于更新策略读取所有远程仓库的元数据groupid/artifactid/maven-metadata.xml,将其与本地仓库的对应元数据合并后,计算出RELEASE或者LATEST的真实的值,然后基于这个真实的值检查本地和远程仓库,如步骤2、3。
5.如果依赖的版本是SNAPSHOT,则基于更新策略读取所有远程仓库的元数据文件groupid/artifactid/version/maven-metadata.xml,将其与本地仓库的对应元数据合并后,得到最新快照版本的值,然后基于该值检查本地仓库,或者从远程仓库下载。
6.如果最后解析得到的构件版本是时间戳格式的快照,则复制其时间戳格式的文件至非时间戳格式,如SNAPSHOT,并使用该非时间戳格式的构件。
7.镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。由于地理位置的因素,镜像往往能提供比中央仓库更快的服务。
镜像的配置需要在settings.xml中配置
mirrors 镜像集:这是一个用于从远程存储库中下载工件的镜像列表。它的工作原理是这样的:POM可以声明一个存储库来解决某些工件。但是,这个存储库有时可能会遇到严重的流量问题,所以人们会将其镜像到多个位置。该存储库定义将具有惟一的id,因此我们可以为该存储库创建镜像引用,以便作为备用下载站点使用。镜像站点将是该存储库的首选服务器。
<mirrors>
mirror 镜像:指定一个存储库镜像站点,而不是一个给定的存储库。这个镜像所提供的存储库具有与镜像元素相匹配的ID,IDs用于继承和直接查找目的,并且在镜像集的集合中必须是惟一的。由于镜像仓库完全屏蔽了被镜像仓库,当镜像仓库不稳定、或者停止服务的时候maven,仍将无法访问被镜像仓库,因而将无法下载构件。
<mirror>
镜像ID
<id>mirrorId</id>
定义的仓库ID
<mirrorOf>repositoryId</mirrorOf>
镜像的名字,用于展示
<name>Human Readable Name for this Mirror.</name>
镜像的地址
<url>http://my.repository.com/repo/path</url>
代表此镜像是所有仓库的镜像
<mirrorOf>*</mirrorOf>
匹配所有远程仓库,使用localhost的除外,使用file://协议的除外,也就是说,匹配所有不在本机上的远程仓库
<mirrorOf>external:*</mirrorOf>
匹配仓库test1和test2,多个仓库用逗号分隔,值为id
<mirrorOf>test1,test2</mirrorOf>
匹配所有的远程仓库,test2除外,使用感叹号将仓库从匹配中排除
<mirrorOf>*,!test2</mirrorOf>
</mirror>
<mirror>
同样可以基于该ID配置认证信息server
<id>alimaven</id>
任何对中央仓库的请求都会转至该镜像
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
8.仓库搜索服务
使用maven进行日常开发的时候,一个常见的问题就是如何寻找需要的依赖,我们可能只知道需要使用的类库的项目名称,但添加maven依赖需要确切的maven坐标,这时,就可以使用仓库搜索服务来根据关键字得到maven坐标。