天天看點

maven是怎麼判斷包在本地倉庫和遠端倉庫哪個是新的?

比如我本地更新了一個項目的jar包,然後install了,編譯其它依賴這個項目不會用遠端倉庫的,而是使用本地的

如果我把這個包送出到倉庫,編譯其它依賴這個項目會自動下載下傳遠端倉庫到本地倉庫

maven是怎麼判斷本地倉庫和遠端倉庫哪個jar包是新的?是用送出時間判斷麼?還是根據版本号判斷的?

maven對構件的更新判斷基本上是兩種,一種是穩定版本,一種是maven特有的snapshot版本。

穩定版本很好判斷,直接根據maven構件的坐标體系就能夠獲得。先從本地倉庫中找,如果本地倉庫沒有,就從pom.xml和setting.xml配置的遠端倉庫來找。

snapshot版本的判斷比較麻煩,基本步驟如下:

假設我在2014年08月22日09時40分52秒在我自己的電腦上使用 “mvn install” 建構了“com.mycompany.demo:test:1.0-snapshot”。

那麼maven會在本地倉庫目錄“~/.m2/com/mycompany/demo/test/1.0-snapshot/”下生成檔案“maven-metadata-local.xml”,内容如下:

十點鐘的時候,其他同僚更新了com.mycompany.demo:test:1.0-snapshot的内容,并通過 "mvn deploy" 釋出到了公司的maven伺服器上。

公司maven伺服器上産生了檔案:

test-1.0-20140822.100021-1.jar

test-1.0-20140822.100021-1.pom

并更新了maven-metadata.xml,内容如下:

在這期間我的電腦上沒有發生過任何關于test的建構。

某一天,我需要建構一個依賴于test的項目,于是我運作了mvn package來打包。

這個時候,maven做了什麼呢(背景:我通過配置鏡像,使我本地maven的任何資源都是從公司的maven伺服器下載下傳的)?

step1:從公司的maven伺服器上下載下傳maven-metadata.xml,重命名為“maven-metadata-<repositoryid>.xml”,并儲存到本地倉庫相應目錄。

step2:比較maven-metadata-local.xml與maven-metadata-<repositoryid>.xml中的lastupdated時間戳的值。

如果maven-metadata-local.xml中的時間戳比較大,則終止。

如果maven-metadata-<repositoryid>.xml中的時間戳較大,則從公司maven伺服器上下載下傳最新版本。即:testu-1.0.1-20130407.081828-34.jar。這個過程分兩步:(1)下載下傳test-1.0-20140822.100021-1.jar到本地maven倉庫。(2)将test-1.0-20140822.100021-1.jar複制一份,覆寫掉原先的test-1.0-snapshot.jar。也就是說,如果maven從遠端倉庫下載下傳了最新的snapshot釋出包的話,那麼最新的待時間戳的包和xxx-snapshot包是完全一樣的。

下一篇: idea .gitignore