maven version解析

一、背景

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下载耗时的一个原因。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值