2011-05-05 148 views

回答

681

Maven中的快照版本是尚未發佈的版本。

想法是之前 a 1.0版本(或任何其他版本)完成後,存在1.0-SNAPSHOT。該版本是可能會變成1.0。它基本上是「1.0正在開發中」。這可能是關閉到真正的1.0版本,或者很遠(例如在0.9版本之後)。

「真實」版本和快照版本之間的區別在於快照可能會更新。這意味着,今天下載1.0-SNAPSHOT可能會提供與昨天或明天下載文件不同的文件。

通常,在開發過程中存在快照依賴性只有,並且沒有發佈版本(即沒有非快照)應該對快照版本有依賴性。

+0

所以快照總是一個更穩定的版本,我假設。該版本號僅適用於使用哪個版本的工件,而不是一個不同的分支源代碼是否正確? – amphibient 2013-10-08 21:54:06

+29

@amphibient:不,快照不一定更穩定:它只是最新的版本。快照_presented_實際版本,它並不在它之後。事實上,版本號碼通常不會請參閱分支機構 – avandeursen 2014-03-23 21:05:13

+4

@avandeursen快照不一定具有您聲明的語義,您可以擁有「主-SNAPSHOT「,後來發佈了1.0版本。它不一定是「FutureVersion-SNAPSHOT」,也不一定在發佈之前。其他一切都是正確的 - 它是一個不穩定的參考移動目標,不能依靠產生可重複的構建。 – 2015-05-07 23:18:47

18

「發佈」是不改變版本的最終版本。

「快照」是一個可以被具有相同名稱的另一個版本替換的版本。這意味着構建可能隨時發生變化,並且仍在積極發展中。

根據相同的代碼,您對不同的構建有不同的工件。例如。你可能有一個調試,一個沒有。一個用於Java 5.0,另一個用於Java 6.通常,更簡單的方法是擁有一個可以完成所需任務的構建版本。 ;)

50

「SNAPSHOT」術語表示構建是給定時間的代碼快照。

通常意味着該版本仍處於重大開發階段。

當需要發佈代碼時,您需要更改pom中列出的版本。因此,不要使用「SNAPSHOT」,而要使用「1.0」。請參考Semantic Versioning specification

+0

來講**語義版本**,-SNAPSHOT版本將作爲預發佈版本:「_A預發佈版本表示版本on是不穩定的,可能無法滿足其相關正常版本所表示的預期兼容性要求。示例:1.0.0-alpha,1.0.0-alpha.1,1.0.0-0.3.7,1.0.0-x.7.z.92._「 – avandeursen 2014-03-23 21:15:03

+0

這聽起來對我來說就像」SNAPSHOT「不是一個「在特定時間你的代碼的快照」,而是「可用代碼的最新版本」。如果這是HTTP,這將是一個標誌,它說:「不要打擾做一個HEAD,去獲取任何東西服務器無論如何「。事實上,它幾乎是相反的」代碼在給定的時間「。 – lilbyrdie 2015-05-21 14:52:45

640

其他三個答案爲您提供了什麼是-SNAPSHOT版本的良好願景。我只是想在Maven找到SNAPSHOT依賴關係時添加一些關於Maven行爲的信息。

當您構建應用程序時,Maven將搜索本地存儲庫中的依賴關係。如果沒有找到穩定版本,它將搜索遠程存儲庫(在settings.xmlpom.xml中定義)來檢索此依賴關係。然後,它會將其複製到本地存儲庫中,以供下一個版本使用。

例如,foo-1.0.jar庫被認爲是穩定版本,並且如果Maven在本地存儲庫中找到它,它將使用這一個用於當前版本。

現在,如果您需要一個foo-1.0-SNAPSHOT.jar庫,Maven將知道此版本不穩定,並且可能會有所更改。這就是爲什麼Maven會嘗試在遠程存儲庫中查找更新版本的原因,即使在本地存儲庫上找到該庫的一個版本。但是,這種檢查每天只進行一次。這意味着如果在本地存儲庫中有foo-1.0-20110506.110000-1.jar(即該庫已在2011年5月6日11:00:00生成),並且如果您在同一天再次運行Maven構建,Maven將而不是檢查存儲庫是否有更新的版本。

Maven提供你一個方法,可以在你的倉庫定義更改此更新策略:

<repository> 
    <id>foo-repository</id> 
    <url>...</url> 
    <snapshots> 
     <enabled>true</enabled> 
     <updatePolicy>XXX</updatePolicy> 
    </snapshots> 
</repository> 

其中XXX可以是:

  • 總是:Maven會檢查是否有新版本上每一個構建;
  • 每天,默認值;
  • 間隔:XXX:在分鐘的間隔(XXX)
  • 從未:Maven將永遠不會嘗試檢索另一個版本。只有在本地不存在的情況下才會這樣做。通過配置,SNAPSHOT版本將作爲穩定庫進行處理。

(settings.xml中的模型,可以發現here)

+1

看來有可能使用命令行開關來強制maven重新下載所有的'SNAPSHOT'版本:'mvn clean package -U'[maven tutorial](http://www.tutorialspoint.com/maven/maven_snapshots。 htm) – 2014-03-25 14:38:52

+3

小心使用'-U'標誌。由於[MNG-4142](http://jira.codehaus.org/browse/MNG-4142),它可能無法達到你期望的效果。 – 2014-05-05 18:16:06

+3

另外值得一提的是,好的做法要求您在創建發佈版本時不使用快照依賴關係,並且實際上如果存在快照依賴關係,則Maven發佈插件將失敗。 – RCross 2014-07-07 08:29:35

3

這是一個快照看起來像一個倉庫,並在這種情況下,不啓用,這意味着在這裏所指的倉庫是穩定的,有沒有必要更新

<project> 
    ... 
    <repositories> 
     <repository> 
      <id>lds-main</id> 
      <name>LDS Main Repo</name> 
      <url>http://code.lds.org/nexus/content/groups/main-repo</url> 
      <snapshots> 
       <enabled>false</enabled> 
      </snapshots> 
     </repository> 
    </repositories> 
</project> 

另一種情況將是:

<snapshots> 
     <enabled>true</enabled> 
</snapshots> 

WH這意味着Maven會查找此存儲庫的更新。您也可以爲帶有標籤的更新指定間隔。

1

通常行家,我們有兩種類型的構建 1)快照建立 2)發佈版本

1)快照建立:快照是特殊版本,表明當前的部署副本並不像普通版本,Maven的檢查每個版本的版本都在遠程存儲庫 中,因此快照構建只是維護構建。

2)發佈構建:發佈意味着在構建版本中刪除SNAPSHOT,這些是常規構建版本。

4

Maven版本可以包含字符串文字「SNAPSHOT」來表示項目當前處於活動開發狀態。例如,如果您的項目具有「1.0-SNAPSHOT」版本,並且您將此項目的工件部署到Maven存儲庫,那麼如果您要將此版本擴展到「1.0-20080207-230803-1」 在2008年2月7日11:08 PM部署發佈。換句話說,當你部署一個快照時,你不會發佈一個軟件組件;您在 在特定時間發佈組件的快照。

所以主要是快​​照版本用於積極開發項目。 如果您的項目依賴於處於活動開發中的軟件組件,您可以依賴快照版本,Maven將定期嘗試 在運行構建版本時從存儲庫下載最新的快照。同樣,如果 系統的下一個版本將具有版本「1.8」,則在項目正式發佈之前,您的項目 將具有「1.8-SNAPSHOT」版本。

例如,下面的依賴會隨時下載春天的最新1.8開發JAR:

<dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring</artifactId> 
     <version>1.8-SNAPSHOT」</version> 
    </dependency> 

Maven

行家釋放過程的一個例子

enter image description here