Maven SNAOPSHOT 版本能一直更新每聪,而 RELEASE 版本同一個(gè)版本號(hào)的包只能上傳一次
Maven 為什么要區(qū)分發(fā)布版本和快照版本
試想一下這樣的情況镶奉,小張?jiān)陂_發(fā)模塊 A 的 2.1 版本拄查,該版本還未正式發(fā)布,與模塊 A 一同開發(fā)的還有模塊B,它由小張的小李開發(fā),B 的功能依賴于 A曙博。在開發(fā)的過(guò)程中,小張需要經(jīng)常將自己最新的構(gòu)建輸出怜瞒,交給小李父泳,供他開發(fā)和集成調(diào)試,問(wèn)題是吴汪,這個(gè)工作如何進(jìn)行呢惠窄?
如果不停更新版本 2.1.1、2.1.2漾橙、2.1.3.... 首先睬捶,小張和小李兩人都需要頻繁地更改 POM,如果有更多的模塊依賴于模塊
A近刘,就會(huì)涉及更多的 POM 更改;其次臀晃,大量的版本其實(shí)僅僅包含了微小的差異觉渴,這樣也會(huì)造成為版本號(hào)的濫用
Maven 的快照版本機(jī)制就是為了解決上述問(wèn)題。在該例中徽惋,小張只需要將模塊 A 的版本設(shè)定為2.1-SNAPSHOT案淋,然后發(fā)布到私服中,在發(fā)布的過(guò)程中险绘,Maven 會(huì)自動(dòng)為構(gòu)件打上時(shí)間戳踢京。比如:2.1-20091214.221414-13 就表示 2009 年 12 月 14 日 22 點(diǎn) 14 分 14 秒的第 13 次快照誉碴。有了該時(shí)間戳,Maven 就能隨時(shí)找到倉(cāng)庫(kù)中該構(gòu)件 2.1-SNAPSHOT 版本最新的文件瓣距。這時(shí)黔帕,小李配置對(duì)于模塊 A 的 2.1-SNAPSHOT
版本的依賴,當(dāng)她構(gòu)件模塊 B 的時(shí)候蹈丸,Maven 會(huì)自動(dòng)從倉(cāng)庫(kù)中檢查模塊 A 的 2.1-SNAPSHOT 的最新構(gòu)件成黄,當(dāng)發(fā)現(xiàn)有更新時(shí)便進(jìn)行下載。默認(rèn)情況下逻杖,Maven 每天檢查一次更新(由倉(cāng)庫(kù)配置的 updatePolicy 控制)奋岁,用戶也可以使用命令行 -U 參數(shù)強(qiáng)制讓 Maven 檢查更新,如:mvn clean install-U
基于快照版本機(jī)制荸百,小張?jiān)跇?gòu)建成功之后才能將構(gòu)件部署至倉(cāng)庫(kù)闻伶,而小李可以完全不用考慮模塊 A 的構(gòu)建,并且他能確保隨時(shí)得到模塊 A 的最新可用的快照構(gòu)件够话,而這一切都不需要額外的手工操作
快照版本的不穩(wěn)定性
當(dāng)項(xiàng)目經(jīng)過(guò)完善的測(cè)試后需要發(fā)布時(shí)蓝翰,就應(yīng)該將快照版本改為發(fā)布版本。例如更鲁,將 2.1-SNAPSHOT 更改為 2.1霎箍,表示該版本已經(jīng)穩(wěn)定,且只對(duì)應(yīng)了唯一的構(gòu)件澡为。相比之下漂坏,2.1-SNAPSHOT 往往對(duì)應(yīng)了大量帶有不同時(shí)間戳的構(gòu)件,這也決定了其不穩(wěn)定性
快照版本只應(yīng)該在組織內(nèi)部的項(xiàng)目或模塊間依賴使用媒至,因?yàn)檫@時(shí)顶别,組織對(duì)于這些快照版本的依賴具有完全的理解及控制權(quán)。項(xiàng)目不應(yīng)該依賴于任何組織外部的快照版本依賴拒啰,由于快照版本的不穩(wěn)定性驯绎,這樣的依賴會(huì)造成潛在危險(xiǎn)。也就是說(shuō)谋旦,即使項(xiàng)目構(gòu)建今天是成功的剩失,由于外部的快照版本依賴實(shí)際對(duì)應(yīng)的構(gòu)件隨時(shí)可能變化,項(xiàng)目的構(gòu)建就可能由于這些外部的不受控制的因素而失敗