maven隨筆

一、在咱們項目頂層的POM文件中,咱們會看到dependencyManagement元素。經過它元素來管理jar包的版本,讓子項目中引用一個依賴而不用顯示的列出版本號。Maven會沿着父子層次向上走,直到找到一個擁有dependencyManagement元素的項目,而後它就會使用在這個dependencyManagement元素中指定的版本號。這樣作的好處:統一管理項目的版本號,確保應用的各個項目的依賴和版本一致,才能保證測試的和發佈的是相同的成果,所以,在頂層pom中定義共同的依賴關係。同時能夠避免在每一個使用的子項目中都聲明一個版本號,這樣想升級或者切換到另外一個版本時,只須要在父類容器裏更新,不須要任何一個子項目的修改;若是某個子項目須要另一個版本號時,只須要在dependencies中聲明一個版本號便可。子類就會使用子類聲明的版本號,不繼承於父類版本號java

二、pom.xml中dependency type oracle

dependency中type默認爲jar即引入一個特定的jar包。那麼爲何還會有type爲pom呢?當咱們須要引入不少jar包的時候會致使pom.xml過大,咱們能夠想到的一種解決方案是定義一個父項目,可是父項目只有一個,也有可能致使父項目的pom.xml文件過大。這個時候咱們引進來一個type爲pom,意味着咱們能夠將全部的jar包打包成一個pom,而後咱們依賴了pom,便可如下載下來全部依賴的jar包。type的值通常有jar、war、pom等,聲明引入的依賴的類型maven

三、classifieride

Classifier多是最容易被忽略的Maven特性,但它確實很是重要,咱們也須要它來幫助規劃座標。設想這樣一個狀況,有一個jar項目,就說是 dog-cli-1.0.jar 吧,運行它用戶就能在命令行上畫一隻小狗出來。如今用戶的要求是但願你能提供一個zip包,裏面不只包含這個可運行的jar,還得包含源代碼和文檔,換句話說,這是比較正式的分發包。這個文件名應該是怎樣的呢?dog-cli-1.0.zip?不夠清楚,僅僅從擴展名很難分辨什麼是Maven默認生成的構件,什麼是額外配置生成分發包。若是能是dog-cli-1.0-dist.zip就最好了。這裏的dist就是classifier,默認Maven只生成一個構件,咱們稱之爲主構件,那當咱們但願Maven生成其餘附屬構件的時候,就能用上classifier。常見的classifier還有如dog-cli-1.0-sources.jar表示源碼包,dog-cli-1.0-javadoc.jar表示JavaDoc包等等。classifier它表示在相同版本下針對不一樣的環境或者jdk使用的jar,若是配置了這個元素,則會將這個元素名在加在最後來查找相應的jar測試

四、scopespa

 

compile命令行

 

默認就是compile,什麼都不配置也就是意味着compile。compile表示被依賴項目須要參與當前項目的編譯,固然後續的測試,運行週期也參與其中,是一個比較強的依賴。打包的時候一般須要包含進去。code

 

testxml

 

scope爲test表示依賴項目僅僅參與測試相關的工做,包括測試代碼的編譯,執行。比較典型的如junit。繼承

 

runntime

 

runntime表示被依賴項目無需參與項目的編譯,不事後期的測試和運行週期須要其參與。與compile相比,跳過編譯而已,說實話在終端的項目(非開源,企業內部系統)中,和compile區別不是很大。比較常見的如JSR×××的實現,對應的API jar是compile的,具體實現是runtime的,compile只須要知道接口就足夠了。oracle jdbc驅動架包就是一個很好的例子,通常scope爲runntime。另外runntime的依賴一般和optional搭配使用,optional爲true。我能夠用A實現,也能夠用B實現。

 

provided

 

provided意味着打包的時候能夠不用包進去,別的設施(Web Container)會提供。事實上該依賴理論上能夠參與編譯,測試,運行等週期。至關於compile,可是在打包階段作了exclude的動做。

 

system

 

從參與度來講,也provided相同,不過被依賴項不會從maven倉庫抓,而是從本地文件系統拿,必定須要配合systemPath屬性使用。

 

import(oMaven 2.0.9開始引入的)

 

這個是maven2.0.9版本後出的屬性,import只能在dependencyManagement的中使用,能解決maven單繼承問題,import依賴關係實際上並不參與限制依賴關係的傳遞性。

 

使用import scope解決maven繼承(單)問題

 

scope的依賴傳遞

 

A–>B–>C。當前項目爲A,A依賴於B,B依賴於C。知道B在A項目中的scope,那麼怎麼知道C在A中的scope呢?答案是:
當C是test或者provided時,C直接被丟棄,A不依賴C;
不然A依賴C,C的scope繼承於B的scope。

相關文章
相關標籤/搜索