maven exclusion 理解

結論:exclusion 表示對傳遞性依賴進行排除,排除後當前項目的依賴jar中,就不會包含該傳遞性依賴。

擴展:項目中的jar 都會在classpath下,排除後的傳遞性依賴,相當於在classpath下清除掉了。所以排除後,可能會引出一些問題。

問題1:本項目顯式使用的依賴被排除了,編譯報錯。這種可以及時修改。

問題2:本項目未顯式使用的依賴被排除了,編譯正常。啟動服務報錯(因為啟動服務時使用到了被排除的依賴)。

如:排除前的依賴

 

 

 排除後的依賴

 

 

模擬服務啟動報錯:啟動類創建一個類型為PredefinedScopeHibernateValidator的對象。

 

 

 錯誤分析:下圖中標記1對應的依賴存在,而標記3對應的依賴已經被排除了,即classpath中不會存在ValidationProvider.class。而啟動服務時,要求加載ValidationProvider類,所以啟動服務報找不到類。

問題3:本項目未顯式使用的依賴被排除了,服務啟動正常。某個方法在運行時,會調用被排除掉的依賴,就會出現找不到的報錯。

如下方法,被調用時,觸發PredefinedScopeHibernateValidator進一步,依賴ValidationProvider,最終導致找不到報錯。

問題3和問題2本質是一樣的,只是問題3在開發時候,不容易發現

 

 

  

 

 

老鳥建議:

      1、升級依賴版本時,盡量不要排除,除非發現問題,如依賴衝突,或者非常明確這個排除的含義。

       2、像springboot、spring 等這種框架級依賴,一般要升級其傳遞性依賴時,建議直接升級框架主依賴版本,主版本一般會包含新版本的傳遞性依賴。

不建議,直接排除框架級依賴的傳遞性依賴,再顯式升級該傳遞性依賴。或者直接顯式的升級,maven 依據最短路徑原則,會解析顯式升級的依賴。