第四節:Maven座標和依賴(下)

依賴調解:
     Maven引入的傳遞性依賴性質,大大簡化了我們需要聲明的依賴,但也會帶來問題,例如:
項目A有這樣的依賴關係:A -> B -> C -> X(1.0) , A -> D -> X(2.0),我們可以看到X是A的傳遞性依賴,但是兩個依賴路徑上有兩個版本的X,這裏可能會出現這樣一個問題:我們需要調用X中的某一個方法Method(),但是兩個版本的X中的Method方法的不一樣,那我們調用的時候只是引入了X的聲明,但是不知道是要調用哪個版本里的Method方法。所以Maven只會解析一個版本的X,那到底解析哪個呢?
     Maven依賴調解的第一原則:路徑最近者優先。
     例如在上例中:A到X(1.0)的路徑是3, A到X(2.0)的路徑是2,則X(2.0)會被Maven解析。
     但是,如果遇到路徑一樣長的情況,則需要另一個原則:
     Maven依賴調解的第二原則:第一聲明者優先。
     即在路徑一樣長的情況下,POM中最先被聲明的依賴會被Maven解析。


可選依賴:
        定義:當一個項目不適合分割成多個子模塊的時候,我們可以使用可選依賴。它的思想在於某些依賴只應用於某些功能,而且當沒有該功能時也不存在該依賴。理想狀況下,一個功能可能被劃分爲一個子模塊,該子模塊是一個只有核心功能的項目,由於當你要使用這個子工程的功能的時候,你會需要它的全部,所以這個子工程只含有非可選性依賴。然而,如果工程不可被分割,這些依賴被聲明爲可選。如果一個用戶想要使用和可選性依賴相關的功能,他們必須要在工程中重新聲明可選性依賴。用一對標籤<optional>true</optional>表示。
      應用場景當一個項目A依賴另一個項目B時,項目A可能很少一部分功能用到了項目B,此時就可以在A中配置對B的可選依賴。舉例來說,一個類似hibernate的項目,它支持對mysql、oracle等各種數據庫的支持,但是在引用這個項目時,我們可能只用到其對mysql的支持,此時就可以在這個項目中配置可選依賴。
      可選依賴不會得到傳遞:就是說項目B的兩個可選依賴X與Y不會傳遞給項目A,他只會對項目B產生影響,當項目A需要使用對項目X的依賴時,需要在POM文件中顯示得聲明。

排除依賴:
     定義顯式的聲明我們不需要的某個依賴
     應用場景
  • 我們的項目A依賴於構件B,而構件B依賴於另一個構件C的SNAPSHOT(快照)版本,此時構件C就成爲了一個傳遞性依賴,但是SNAPSHOT版本是不穩定的,會對項目A造成影響,所以我們就需要排除掉這個依賴,然後在項目A中顯式得聲明我們需要的構件C的某個正式版本。
  • 我們的項目A依賴於構件B,但是由於某些原因,該構件不在中央倉庫中,我們就需要排除掉這個依賴,然後找到一個替代的構件顯式得聲明他。
     使用exclusions元素聲明排除依賴,exclusions中可以包含一個或多個exclusion的子元素,因此可以排除一個或多個依賴。需要注意的是,在聲明excliuison元素時,只需要groupid和artifactId,而不需要version元素,因爲可加載到類路徑的依賴中,不會出現groupid和artifactId相同,而version不同的情況,所以只需要groupie和artifactId就可以唯一定位某個依賴。而我們再聲明我們需要的構件時,需要加上version元素。



歸類依賴:
     定義:對於版本號相同的依賴統一管理的方式。
     例子:比如我們有好幾個對Spring Framework框架的依賴。它們分別是org.springframework:spring-core:2.5.6,org.springframework:spring-beans:2.5.6,它們是來自同一個項目的不同模塊。當我們需要升級框架版本時,這些依賴均需一起升級,所以我們可以定義一個版本屬性,下面相關依賴均引用這個屬性。
     寫法:在POM.xml文件中使用properties元素定義Maven屬性,然後定義一個XX子元素.然後我們在需要用到版本號的時候,我們使用{xx}來代替。

優化依賴:
     我們可以使用mvn dependency:analyze來分析依賴樹。
     我們需要注意的兩個方面:
  • Used undeclared dependencies:這裏是指在項目中用到了,但是沒有顯式聲明的依賴。例如在代碼中使用了import聲明的依賴類庫A,但是這個依賴A是通過直接依賴B傳遞進來的,當我們升級直接依賴B時,此傳遞性依賴A也會隱式得發生改變,可能原版我們依賴A編寫的某些接口就無法使用了,這會造成編譯失敗,然後因爲這個依賴是隱式的,是隱藏落在很多直接依賴後面的,所以這種錯誤很難定位到,因此,我們顯式聲明項目任何項目中直接用到的(import進來的)依賴。
  • Unused declared dependencies:這裏是指項目中未使用到,但是顯式聲明的依賴。但是對於這類依賴不能簡單的直接刪除其聲明,因爲mvn dependency:analyze只會分析編譯主代碼和測試代碼時用到的依賴,一些執行測試和運行時需要的依賴它就發現不了,因此,我們需要仔細測試才能刪除報Unused declared dependencies的依賴。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章