码迷,mamicode.com
首页 > 其他好文 > 详细

Maven学习(3)-依赖管理-依赖下载详细过程

时间:2020-01-23 18:27:04      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:value   定位   基于   ada   参考   管理   时间戳   back   web   

参考来源:

https://www.liupeng.mobi/archives/1816

https://blog.csdn.net/chenpuzhen/article/details/84201811

https://blog.csdn.net/pinebud55/article/details/78667299

https://www.cnblogs.com/songcuiting/p/8783750.html

 

一、Maven中坐标概念                                                                                       

Maven对依赖进行统一管理,通过定义项目的依赖关系,Maven从仓库查找和下载依赖的组件(jar包、war包、pom文件等等)。那么Maven如何来唯一标识一个依赖组件呢?这就涉及到Maven中坐标的概念。

Maven中的坐标包含:groupId 、artifactId、version 三个元素:

  • groupId:项目所在组,一般是组织或公司。
  • artifactId:是当前项目在组中的唯一ID。
  • version:表示版本。Release表示发布版本,SNAPSHOT表示快照,表示此项目还在开发中,不稳定。

Maven在定义依赖时,需要指定如上的坐标。如:以pom.xml中的junit为例:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.1.1</version>
</dependency>

通过如上依赖组件的坐标定义,Maven从仓库中按照 “groupId”\“artifactId”\"version" 的路径来下载依赖组件包。

 

二、通过greoupId和ArtifactId唯一定位到一个项目,但是项目过程中伴随着多次编译和发布,Maven中是如何管理version的?

详细的关于Maven中版本管理的细节,见对应章节。此处仅做大概描述,为后续解释Maven下载依赖组件过程做铺垫。

Maven中的项目版本分为Release版本和Snapshot版本。

Release版本为发布的稳定版本,可以理解为一个版本号只归档、发布一次。版本号一般采用类似1.0、1.1的方式。

Snapshot版本为开发过程中的迭代版本,对于同一版本号,开发过程中可以多次编译、归档。版本号一般采用"版本号-SNAPSHOT"的格式,比如1.0-SNAPSHOT。

 

三、基于以上坐标、版本机制,我们看看依赖组件在仓库中是如何归档的?                                                

以Mytest项目为例,其在远程仓库、本地仓库归档内容可以如下:

1、在远程仓库的归档(Realse仓库)

|--1.0.0

    |--Mytest-1.0.0.pom

    |--Mytest-1.0.0.pom.asc

    |--Mytest-1.0.0.jar

    |--Mytest-1.0.0.jar.asc

|--1.0.1

    |--Mytest-1.0.1.pom

    |--Mytest-1.0.1.pom.asc

    |--Mytest-1.0.1.jar

    |--Mytest-1.0.1.jar.asc

|--maven-metadata.xml

如上,其项目归档根目录下,以版本号为目录来归档不同的release版本。

1)每个release版本下,包含jar项目包、及.pom文件。其中.pom文件记录的是项目本次版本的pom定义,内含本项目坐标、依赖关系、插件信息、构建过程定义等。

2)项目归档跟目录下,还有一个maven-metadata.xml文件,这个文件干啥用呢?

      maven-metadata.xml内容样例如下:

  <?xml version="1.0" encoding="UTF-8"?>
  <metadata>
    <groupId>com.AAAAA</groupId>
    <artifactId>Mytest</artifactId>
    <version>1.1.</version>
    <versioning>
      <latest>1.1.1</latest>
      <release>1.1.1</release>
      <versions>
        <version>1.0.0</version>
        <version>1.0.1</version>
      </versions>
      <lastUpdated>20191221041500</lastUpdated>
    </versioning>
  </metadata>

 

        如上样例所示,maven-metadata.xml中实际上记录的是项目的历史版本过程。

2、在远程仓库的归档(Snapshot仓库)

|--1.0.0-SNAPSHOT

    |--Mytest-1.0.0-20191215.090030.pom

    |--Mytest-1.0.0-20191215.090030.jar

    |--Mytest-1.0.0-20191216.160005.pom

    |--Mytest-1.0.0-20191216.160005.jar

    |--maven-metadata.xml

|--1.0.1-SNAPSHOT

    |--Mytest-1.0.1-20191220.100021.pom

    |--Mytest-1.0.1-20191220.100021.jar

    |--Mytest-1.0.1-20191220.164405.pom

    |--Mytest-1.0.1-20191220.164405.jar

    |--maven-metadata.xml

|--maven-metadata.xml

如上,其项目归档根目录下,以版本号为目录来归档不同的Snapshot版本。和Release仓库文件目录结构的差异如下:

1)版本目录(如1.0.1-SNAPSHOT目录)下多了个maven-metadata.xml文件。样例:

       <?xml version="1.0" encoding="UTF-8"?>
  <metadata modelVersion="1.1.0">
    <groupId>com.AAAAA</groupId>
    <artifactId>Mytest</artifactId>
    <version>1.0.1-SNAPSHOT</version>
    <versioning>
      <snapshot>
        <timestamp>20191220.164405</timestamp>
        <buildNumber>34</buildNumber>
      </snapshot>
      <lastUpdated>20191220164405</lastUpdated>
      <snapshotVersions>
        <snapshotVersion>
           <extension>jar</extension>
          <value>1.0.1-20191220.100021</value>
          <updated>20191220100021</updated>
        </snapshotVersion>
        <snapshotVersion>
          <extension>pom</extension>
          <value>1.0.1-20191220.164405</value>
          <updated>20191220164405</updated>
        </snapshotVersion>
      </snapshotVersions>
    </versioning>
  </metadata>

      因为Maven中同一个Snopshot版本是可以多次编译、归档的,所以具体某个Snopshot版本内的mave-matedata.xml记录了本Snapshot版本的多次归档的历史记录。

2)Snapshot版本跟目录下的maven-matedata.xml样例如下:   

  <?xml version="1.0" encoding="UTF-8"?>
  <metadata>
    <groupId>com.fyklocal</groupId>
    <artifactId>demologinserver</artifactId>
    <version>1.0.1-SNAPSHOT</version>
    <versioning>
      <versions>
        <version>1.0.0-SNAPSHOT</version>
        <version>1.0.1-SNAPSHOT</version>
      </versions>
      <lastUpdated>20200123083452</lastUpdated>
    </versioning>
  </metadata>

       项目根目录下成这个maven-metadata.xml记录的是本项目SNAPSHOT版本的历史记录。

3、本地仓库中此项目的目录

|--1.0.0

    |--Mytest-1.0.0.pom

    |--Mytest-1.0.0.pom.asc

    |--Mytest-1.0.0.jar

    |--Mytest-1.0.0.jar.asc

|--1.0.0-SNAPSHOT

    |--Mytest-1.0.0-SNAPSHOT.pom

    |--Mytest-1.0.0-SNAPSHOT.jar

    |--maven-metadata-local.xml

|--1.0.1

    |--Mytest-1.0.1.pom

    |--Mytest-1.0.1.pom.asc

    |--Mytest-1.0.1.jar

    |--Mytest-1.0.1.jar.asc

|--1.0.1-SNAPSHOT

    |--Mytest-1.0.1-SNAPSHOT.pom

    |--Mytest-1.0.1-SNAPSHOT.jar

    |--maven-metadata-local.xml

|--maven-metadata-local.xml

和远程仓相比:

1)maven-metadata.xml文件本地命名为meven-metadata-local.xml

2)根目录的maven-metadata-local.xml中同时记录了Release和SNOAPSHOT版本的历史。

  <?xml version="1.0" encoding="UTF-8"?>
  <metadata>
    <groupId>com.AAAAA</groupId>
    <artifactId>Mytest</artifactId>
    <version>1.1.</version>
    <versioning>
      <latest>1.1.1</latest>
      <release>1.1.1</release>
      <versions>
        <version>1.0.0-SNAPSHOT</version>
        <version>1.0.0</version>
        <version>1.0.1-SNAPSHOT</version>
        <version>1.0.1</version>
      </versions>
      <lastUpdated>20191221041500</lastUpdated>
    </versioning>
  </metadata>

3)SNAPSHOT版本目录下仅记录最新一次SNOTSHOT版本信息(未中远程仓下载,则是本地最后一次mvn install的;从远程仓下载,则是远程仓上本SNAPSHOT版本归档的最后一次)。

     .pom文件和.jar文件由于只保存最新一份,直接以SNAPSHOT命名,不需要以时间戳命名。

     maven-metadata-local.xml文件内容如下。和远程仓相比,版本也直接使用1.0.1-SNAPSHOT,不需要用数字命名。

  <?xml version="1.0" encoding="UTF-8"?>
  <metadata modelVersion="1.1.0">
    <groupId>com.fyklocal</groupId>
    <artifactId>demologinserver</artifactId>
    <version>1.0.1-SNAPSHOT</version>
    <versioning>
      <snapshot>
        <localCopy>true</localCopy>
      </snapshot>
      <lastUpdated>20191220164405</lastUpdated>
      <snapshotVersions>
        <snapshotVersion>
          <extension>jar</extension>
          <value>1.0.1-SNAPSHOT</value>
          <updated>20191220100021</updated>
        </snapshotVersion>
        <snapshotVersion>
          <extension>pom</extension>
          <value>1.0.1-SNAPSHOT</value>
          <updated>20191220164405</updated>
        </snapshotVersion>
      </snapshotVersions>
    </versioning>
  </metadata>

 

总结:

1).pom文件是对应每个版本包一份,用于记录当前版本包的POM信息。

2)maven-metadata.xml用于记录项目构建历史记录。下载依赖组件使,用于做版本和时间比较。

 

四、那么Maven从中央仓库、远程仓库下载依赖组件时,到底是如何根据版本工作的呢?                                                

Maven学习(3)-依赖管理-依赖下载详细过程

标签:value   定位   基于   ada   参考   管理   时间戳   back   web   

原文地址:https://www.cnblogs.com/yickel/p/12230839.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!