maven version解析

maven version解析maven 的版本虽然我们经常看到,但对于大部分人来说并没有一个清晰的概念。这篇文章将会告诉你:maven 版本的标准规则是什么?maven如何区分snapshot版本?maven 如何比较版本的大小。 其中前三个版本用”.”分割,最后一个用“-”分割。各个版本可以任意缺失,但…

一、背景

maven 的版本虽然我们经常看到,但对于大部分人来说并没有一个清晰的概念。这篇文章将会告诉你:maven 版本的标准规则是什么?maven如何区分snapshot版本?maven 如何比较版本的大小。

二、版本规则

maven 版本有四个部分组成,如下所示:
<主版本>.<次版本>.<增量版本>-<里程碑版本>
其中前三个版本用”.”分割,最后一个用“-”分割。各个版本可以任意缺失,但至少保留一个(即版本不可为空);
需要注意以下几个问题:

  • 前三个版本具有依赖关系,即次版本存在,主版本一定存在,增量版本存在,次版本不允许存在,即不允许出现:..1,1..1的情况;
  • 前三个版本必须以数字的形式出现,且如果位数大于1,不允许以0为开头,即不允许出现1.01.1这种情况

里程碑版本可以由两部分组成,官方称之为buildNumber和qualifier,但是二者只允许出现一个。二者的出现的规则有一定的要求:

  • buildNumber只允许以数字的形式出现,且如果有多位数,不允许以0为开头,即1.0-1这种形式
  • qualifier可以以任何非buildNumber的形式出现,比如1.0-SNAPSHOT,1.0-beta-2
  • 如果版本未按照上述规则定义,比如”version1″,则qualifier=version1,其它版本均不存在。

三、版本比较

基本规则如下:

  • 主版本,次版本,增量版本,以及buildNumber按照数字的大小进行比较。需要注意的是,主版本,次版本,增量版本以及buildNumber默认为0,即1.0=1,1-0=1.0
  • qualifier 按照字符串进行比较,即1-beta>1-alpha

四、snapshot

2.1 什么是snapshot

snapshot即非稳定版本,按照官方规则,该版本在正式发布之后是不允许存在的,因为它存在很多不确定性,会导致项目的不稳定。那maven是如何判断你定义的版本是snapshot呢?
maven 在判断是否是snapshot时,其本身并未遵循版本定义规则,它只需要满足两种情况就认为是Snapshot

  • 以-SNAPSHOT为版本结尾,区分大小写
  • 满足时间戳正则匹配:即以-{年}{月}{日}-{时}{分}{秒}-{n}为结尾
    ^(.*-)?([0-9]{8}\\.[0-9]{6}-[0-9]+)$

    其实maven 2也认为LATEST为snapshot版本,但maven3已经不支持了

    2.2 如何找到最新的Snapshot版本

    当我们开发一个snapshot版本(如xxx-SNAPSHOT),并推送到远程时,远程仓库在保存版本号时,会将SNAPSHOT替换成时间戳(如xxx-20171114.221414-13),并更新meta文件,类似如下:

    <!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
    <?xml version="1.0" encoding="UTF-8"?>
    <metadata modelVersion="1.1.0">
    <groupId>com.my.testu</groupId>  
    <artifactId>a</artifactId>
    <version>1.0.1-SNAPSHOT</version>
    <versioning>    
      <snapshot>
        <timestamp>20160909.081828</timestamp>
        <buildNumber>34</buildNumber>    
      </snapshot>
      <lastUpdated>20160909081828</lastUpdated>
      <snapshotVersions>
        <snapshotVersion>        
          <extension>jar</extension>
          <value>1.0.1-20160909.081828-34</value>
          <updated>20160909081828</updated>
        </snapshotVersion>
        <snapshotVersion>        
          <extension>pom</extension>
          <value>1.0.1-20160909.081828-34</value>
          <updated>20160909081828</updated>
        </snapshotVersion>
    </versioning>
    </metadata>

当我们引用一个snapshot版本时,通常会如下定义:

<dependency>
    <groupId>xxx.xxxx</groupId>
    <artifactId>xxx</artifactId>
    <version>{version}-SNAPSHOT</version>
</dependency>

当maven 检测到需要依赖一个snapshot版本时,就会尝试从所有的远程仓库下载对应的meta文件,并在与本地的meta文件进行merge,得到一个与{version}并带有时间戳的最新的版本号(xxx-20171114.221414-13),然后
maven再尝试下载该版本。这也是为什么Snashot下载耗时的一个原因。

今天的文章maven version解析分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/14866.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注