maven的依賴管理是基於版本管理的,在maven2之后,把版本管理細化snapshot 快照倉庫和release發布倉庫。release版本,對於發布狀態的artifact(就是被依賴的jar包),如果版本號相同,即使我們內部的鏡像服務器上的組件比本地新,maven也不會主動下載的。這里也為snapshot 的出現打下了伏筆。
快照版本,很多人不是特別理解為什么要有這個事物的出現,它的出現對於編程有什么幫助嗎?沒有snapshot出現之前,我們開發過程依賴別人開發某個包,通常maven會集中管理這些依賴包,它會要求別人打包成jar放到鏡像服務器上,自己本地的pom.xml文件設置了依賴后,maven編譯時,會自動從鏡像服務器上下載依賴。但如果鏡像服務器上有相同版本的依賴時,maven就不會下載,這是上段文字的白話版本,那么舉個例子說明一下。
比如,你的工程要依賴的core版本是 1.0.0 版本,結果這個版本還正處於對方(叫小菜吧)的開發過程中,他利用maven命令mvn install打包成jar,並部署到服務器上,根據pom設定的版本,你順利下載了依賴包。但小菜后續開發過程,發現了一個致命bug,那么他再操作一次,那么,即使服務器的更新是你需要的,你只能干着急,只能跟小菜吼一聲,“你的版本,老子無法更新依賴包,再給我發一個新的版本上去。”小菜一聽,好吧,那我把版本升到 1.0.1 版本,你通過update dependencies 下載了這個新版本的jar包。這樣的情況,會循環地出現,那么你和小菜有點惱火了,maven就是老鼠鑽到風箱里,兩頭受氣,maven想能不能開發一個功能,使雙方默認可以上傳並打包下載到最新的開發版本,而不用修改版本號,否則開發完成之后,服務器上是一堆的release版本。有了這個思路,maven增加了划時代的功能,snapshot ,這樣依賴版本為 1.0.0-SNAPSHOT (注意必須為全大寫),當服務器上有更新時,會自動下載到本地,省去了不少、和小菜的溝通時間,也減小了不少由於版本問題帶來的編譯錯誤。
任何東西的使用,需要遵循其規則,snapshot雖然好用,如果使用不當,反而易造成困惑問題。首先,開發一個依賴jar包時,注意snapshot版本號的不同,需要一個統一的地方記錄各自的版本,在開發周期很長的情況下,版本號release的順序並非按版本號順序發布,重要的是,大家的開發版本號不能重復。如果你也在開發這個core.jar,你依賴於本地,而服務器上別人有也相同版本號的core.jar定期放在服務器上,這樣,本地的jar經常會被來自服務器版本覆蓋而導致錯誤。
總結一下,我們在開發階段,可以將公用庫的版本設置為快照版本,而被依賴組件則引用快照版本進行開發,在公用庫的快照版本更新后,我們也不需要修改pom版本號來下載新的版本,直接mvn執行相關編譯、打包命令即可重新下載最新的快照庫了,從而保證了開發進度和質量。
1、mvn調試信息:
比如:mvn -X -e clean compile
-e:打印錯誤信息 。
-X:代表debug模式 。
2、如果在setting里用mirror的,直接報找不到對應的jar錯誤。
原來setting配置:
<mirrors>
<mirror>
<id>Nexus</id>
<url>http://192.168.4.11/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
這個是有問題的,可以用-X -e看到如下信息:
[DEBUG] Repositories (dependencies): [Nexus (http://192.168.4.11/content/groups/
public/, releases)]
[DEBUG] Repositories (plugins) : [Nexus (http://192.168.4.11/content/groups/
public/, releases)]
明顯public只對release有效,對snapshot無效。解決辦法只能需要定義mirrortype指定對snapshot有效。
更改為:
<mirrors>
<mirror>
<id>Nexus</id>
<url>http://192.168.4.11/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
<mirror>
<id>Nexus2</id>
<url>http://192.168.4.11/content/groups/public/</url>
<mirrorOf>public-snapshots</mirrorOf> // 對snapshots有效
</mirror>
</mirrors>
<profiles> //定義public-snapshots profile
<profile>
<id>public-snapshots</id>
<repositories>
<repository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>public-snapshots</activeProfile>
</activeProfiles> //使profile生效。
再看debug輸出:
[DEBUG] Repositories (dependencies): [Nexus (http://192.168.4.11/content/groups/
public/, snapshots), central (http://repo1.maven.org/maven2, releases)]
[DEBUG] Repositories (plugins) : [Nexus (http://192.168.4.11/content/groups/
public/, snapshots), central (http://repo1.maven.org/maven2, releases)]
搞定!
總感覺上面的方法有點蹩腳!
sonatype的官方配置如下:
另外一種配置方法見:http://www.sonatype.com/books/nexus-book/reference/maven-sect-single-group.html
3、 注意:maven會自動從倉庫中檢查模塊A的快照版本的最新版本,當發現有更新時便進行下載。默認情況下,maven每天檢查一次更新(由倉庫配置的updatePolicy控制),用戶也可以使用命令-U參數強制讓maven檢查更新,如maven clean install -U。
元素updatePlocy說明:用來配置maven從遠程倉庫檢查更新的頻率,默認的值為daily,表示每天檢查一次。
比如,你的工程要依賴的core版本是 1.0.0 版本,結果這個版本還正處於對方(叫小菜吧)的開發過程中,他利用maven命令mvn install打包成jar,並部署到服務器上,根據pom設定的版本,你順利下載了依賴包。但小菜后續開發過程,發現了一個致命bug,那么他再操作一次,那么,即使服務器的更新是你需要的,你只能干着急,只能跟小菜吼一聲,“你的版本,老子無法更新依賴包,再給我發一個新的版本上去。”小菜一聽,好吧,那我把版本升到 1.0.1 版本,你通過update dependencies 下載了這個新版本的jar包。這樣的情況,會循環地出現,那么你和小菜有點惱火了,maven就是老鼠鑽到風箱里,兩頭受氣,maven想能不能開發一個功能,使雙方默認可以上傳並打包下載到最新的開發版本,而不用修改版本號,否則開發完成之后,服務器上是一堆的release版本。有了這個思路,maven增加了划時代的功能,snapshot ,這樣依賴版本為 1.0.0-SNAPSHOT (注意必須為全大寫),當服務器上有更新時,會自動下載到本地,省去了不少、和小菜的溝通時間,也減小了不少由於版本問題帶來的編譯錯誤。
任何東西的使用,需要遵循其規則,snapshot雖然好用,如果使用不當,反而易造成困惑問題。首先,開發一個依賴jar包時,注意snapshot版本號的不同,需要一個統一的地方記錄各自的版本,在開發周期很長的情況下,版本號release的順序並非按版本號順序發布,重要的是,大家的開發版本號不能重復。如果你也在開發這個core.jar,你依賴於本地,而服務器上別人有也相同版本號的core.jar定期放在服務器上,這樣,本地的jar經常會被來自服務器版本覆蓋而導致錯誤。
總結一下,我們在開發階段,可以將公用庫的版本設置為快照版本,而被依賴組件則引用快照版本進行開發,在公用庫的快照版本更新后,我們也不需要修改pom版本號來下載新的版本,直接mvn執行相關編譯、打包命令即可重新下載最新的快照庫了,從而保證了開發進度和質量。
1、mvn調試信息:
比如:mvn -X -e clean compile
-e:打印錯誤信息 。
-X:代表debug模式 。
2、如果在setting里用mirror的,直接報找不到對應的jar錯誤。
原來setting配置:
<mirrors>
<mirror>
<id>Nexus</id>
<url>http://192.168.4.11/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
這個是有問題的,可以用-X -e看到如下信息:
[DEBUG] Repositories (dependencies): [Nexus (http://192.168.4.11/content/groups/
public/, releases)]
[DEBUG] Repositories (plugins) : [Nexus (http://192.168.4.11/content/groups/
public/, releases)]
明顯public只對release有效,對snapshot無效。解決辦法只能需要定義mirrortype指定對snapshot有效。
更改為:
<mirrors>
<mirror>
<id>Nexus</id>
<url>http://192.168.4.11/content/groups/public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
<mirror>
<id>Nexus2</id>
<url>http://192.168.4.11/content/groups/public/</url>
<mirrorOf>public-snapshots</mirrorOf> // 對snapshots有效
</mirror>
</mirrors>
<profiles> //定義public-snapshots profile
<profile>
<id>public-snapshots</id>
<repositories>
<repository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public-snapshots</id>
<url>http://public-snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>public-snapshots</activeProfile>
</activeProfiles> //使profile生效。
再看debug輸出:
[DEBUG] Repositories (dependencies): [Nexus (http://192.168.4.11/content/groups/
public/, snapshots), central (http://repo1.maven.org/maven2, releases)]
[DEBUG] Repositories (plugins) : [Nexus (http://192.168.4.11/content/groups/
public/, snapshots), central (http://repo1.maven.org/maven2, releases)]
搞定!
總感覺上面的方法有點蹩腳!
sonatype的官方配置如下:
另外一種配置方法見:http://www.sonatype.com/books/nexus-book/reference/maven-sect-single-group.html
3、 注意:maven會自動從倉庫中檢查模塊A的快照版本的最新版本,當發現有更新時便進行下載。默認情況下,maven每天檢查一次更新(由倉庫配置的updatePolicy控制),用戶也可以使用命令-U參數強制讓maven檢查更新,如maven clean install -U。
元素updatePlocy說明:用來配置maven從遠程倉庫檢查更新的頻率,默認的值為daily,表示每天檢查一次。