Maven实践(七)---仓库

来源:互联网 发布:精美立体数据图表 ppt 编辑:程序博客网 时间:2024/06/16 20:47

任何一个构建都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径,这便是Maven的仓库布局方式。

仓库的分类

1.本地仓库:首先查看这个仓库,存在构件直接使用(默认情况下在用户目录的.m2/repositiory/下)
自定义本地仓库目录地址:

<settings>    <localRepository>自定义的目录</localRepository></settings>

2.远程仓库:构件不存在或者查看是否有新版本,去这个仓库查看

Tips:如果2个仓库都没有就会报错

远程仓库:

  1. 中央仓库:Maven核心自带的远程仓库
  2. 私服:在局域网内部架设,用其代理所以外部仓库
  3. 其他公共库:常见的有Java.net
    Maven库和JBoss Maven库

远程仓库的配置

默认的中央仓库无法满足项目的需求,可能项目需要的构建存在于另外一个远程仓库(如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个子元素:enabledupdatePolicy(从远程仓库更新的频率默认为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会自动找到最新的快照,这背后的依赖解析机制如下:

  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,将其与本地仓库的对应元数据合并后,得出最新的快照版本的值,然后基于这个值检查本地和远程仓库,步骤如2 3
  6. 如果最后解析到的构件版本是时间戳格式的快照,则复制其时间戳格式的文件至非时间戳格式,如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,表示任何对中央仓库的访问请求都会转到该镜像

配置镜像的几种方式:

  1. <mirrorof>*</mirrorof>:匹配所有远程仓库
  2. <mirrorof>external:*</mirrorof>:匹配所有远程仓库,使用localhost的除外,使用file://协议的除外(匹配所有不在本机的仓库)
  3. <mirrorof>repo1,repo2</mirrorof>:匹配仓库repo1,repo2(使用都好分割多个远程仓库)
  4. <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/

0 0