参考来源:
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.jar
|--1.0.1
|--Mytest-1.0.1.pom
|--Mytest-1.0.1.jar
|--1.1.0
|--Mytest-1.1.0.pom
|--Mytest-1.1.0.jar
|--1.1.1
|--Mytest-1.1.1.pom
|--Mytest-1.1.1..jar
|--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>
<version>1.1.0</version>
<version>1.1.1</version>
</versions>
<lastUpdated>20200101041500</lastUpdated>
</versioning>
如上样例所示,maven-metadata.xml中实际上记录的是项目的历史版本过程。
2、在远程仓库的归档(Snapshot仓库)
|--1.0.0
|--Mytest-1.0.0.pom
|--Mytest-1.0.0.jar
|--1.0.1
|--Mytest-1.0.1.pom
|--Mytest-1.0.1.jar
|--1.1.0
|--Mytest-1.1.0.pom
|--Mytest-1.1.0.jar
|--1.1.1
|--Mytest-1.1.1.pom
|--Mytest-1.1.1..jar
|--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>
<version>1.1.0</version>
<version>1.1.1</version>
</versions>
<lastUpdated>20200101041500</lastUpdated>
</versioning>
如上样例所示,maven-metadata.xml中实际上记录的是项目的历史版本过程。
|--cd-build-scripts-0.0.5.pom
|--cd-build-scripts-0.0.5.zip
cd-build-scripts-0.0.5.pom内容如下:
通过如上坐标,就可以准确定位唯一项目的唯一版本。
如:pom.xml中依赖junit的样例: