本篇目標:通過講解maven依賴範圍、傳遞性依賴、可選依賴、依賴調節,讓大家知道maven依賴的正確使用姿勢是什麼。
什麼是依賴範圍
Java在進行代碼編譯和運行的時候都分別需要指定classpath路徑,不然將會出現找不到對應的類。同樣的maven默認提供了編譯主代碼時、測試代碼時、運行時的3套classpath。而依賴範圍就是用來控制該jar應該被引入哪一個classpath中,maven有以下幾種依賴範圍:
- compile
jar包會引入上述聲明的3個classpt
- test
jar包會引入測試代碼時的classpath
- provided
jar包會引入編譯主代碼時、測試代碼時的classpth
- runtime
jar包會引入測試代碼時和運行時的classpath
maven中未指定時默認的依賴範圍爲compile
什麼是傳遞性依賴
指X->B , B->C ,那麼X是否依賴了C呢?如果依賴了那麼它的依賴範圍又是什麼呢?maven對於這幾種情況都分別進行的規範定義,如圖1-1:
最左邊一列即爲X工程第一直接依賴範圍,最上一行爲X工程第二直接依賴範圍,其它的爲X工程最終的傳遞性依賴範圍。舉個例子:X->B(依賴範圍:compile) , B->C(依賴範圍:test) ,那麼X對於C的傳遞性依賴範圍由圖1-1得 test。
由圖1-1我們可以總結如下幾點:
- 如果第二直接依賴範圍爲compile,那麼傳遞性依賴範圍與第一直接依賴範圍是一致的。
- 如果第二直接依賴範圍爲test,那麼依賴是不會進行傳遞的。
- 如果第二直接依賴範圍是provied,那麼只有第一直接依賴範圍是provided纔會進行傳遞,其餘不會。
什麼是可選依賴
我們知道maven的依賴是可以進行傳遞的,但是對於有一些jar我們是不希望它進行傳遞的,可以通過**< optional >true< / optional>** 將它標記爲可選依賴,那麼該依賴將不會被進行傳遞。
依賴調節
當項目存在這種依賴情況時:X->B,C(1.0版本) , B->C(1.1版本),maven會參照以下兩條原則自動進行依賴調節:
- 路徑最短優先
- 路徑相同時,採取配置順序優先
如上情況X工程最終依賴的是C(1.0版本)
我們可以通過現主流的idea來更直觀的看看maven是如何進行依賴調節的,假設member-web工程的依賴關係如圖1-2
根據路徑最短優先member-web將會依賴member-dao1:1.0 ,idea的依賴解析插件將會如圖1-3進行展示:
書寫技術文章是一個循序漸進的過程,所以我不能保證每句話、每行代碼都是對的,但至少能保證不復制、不粘貼,每篇文章都是自己對技術的認識、細心斟酌總結出來的。喬布斯說:我們在這個星球上的時間都很短,很少有機會去做幾件真正偉大的事情,同時要做得好,我必須要趁我還年輕的時候完成這些事。
其實我想說的是,我是一枚程序員,我只想在有限的時間內儘可能去沉澱我這一生中所能沉澱下來的東西