maven version解析

1、背景

maven 的版本雖然咱們常常看到,但對於大部分人來講並無一個清晰的概念。這篇文章將會告訴你:maven 版本的標準規則是什麼?maven如何區分snapshot版本?maven 如何比較版本的大小。bash

2、版本規則

maven 版本有四個部分組成,以下所示:
<主版本>.<次版本>.<增量版本>-<里程碑版本>
其中前三個版本用"."分割,最後一個用「-」分割。各個版本能夠任意缺失,但至少保留一個(即版本不可爲空);
須要注意如下幾個問題:maven

  • 前三個版本具備依賴關係,即次版本存在,主版本必定存在,增量版本存在,次版本不容許存在,即不容許出現:..1,1..1的狀況;
  • 前三個版本必須以數字的形式出現,且若是位數大於1,不容許以0爲開頭,即不容許出現1.01.1這種狀況

里程碑版本能夠由兩部分組成,官方稱之爲buildNumber和qualifier,可是兩者只容許出現一個。兩者的出現的規則有必定的要求:ui

  • buildNumber只容許以數字的形式出現,且若是有多位數,不容許以0爲開頭,即1.0-1這種形式
  • qualifier能夠以任何非buildNumber的形式出現,好比1.0-SNAPSHOT,1.0-beta-2
  • 若是版本未按照上述規則定義,好比"version1",則qualifier=version1,其它版本均不存在。

3、版本比較

基本規則以下:spa

  • 主版本,次版本,增量版本,以及buildNumber按照數字的大小進行比較。須要注意的是,主版本,次版本,增量版本以及buildNumber默認爲0,即1.0=1,1-0=1.0
  • qualifier 按照字符串進行比較,即1-beta>1-alpha

4、snapshot

2.1 什麼是snapshot

snapshot即非穩定版本,按照官方規則,該版本在正式發佈以後是不容許存在的,由於它存在不少不肯定性,會致使項目的不穩定。那maven是如何判斷你定義的版本是snapshot呢?
maven 在判斷是不是snapshot時,其自己並未遵循版本定義規則,它只須要知足兩種狀況就認爲是Snapshotcode

  • 以-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版本時,一般會以下定義:xml

<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下載耗時的一個緣由。開發

相關文章
相關標籤/搜索