第六章 仓库

作者: JarvisTH | 来源:发表于2019-05-05 15:43 被阅读0次

    一、什么是仓库
    任何一个依赖、插件或项目构件的输出,都可以称为构件。任何一个构件都有一组坐标唯一标识。

    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/

    相关文章

      网友评论

        本文标题:第六章 仓库

        本文链接:https://www.haomeiwen.com/subject/xmnxoqtx.html