1. 程式人生 > 實用技巧 >maven依賴順序原則

maven依賴順序原則

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

使用maven的程式設計師都會遇到一個問題,那就是maven依賴衝突的問題,這會導致ClassNotFound或者MethodNotFound這樣的異常。其實只要明白maven依賴的根本性的原則就不怕這樣的問題了。

一、maven依賴原則
1.間接依賴路徑最短優先
一個專案test依賴了a和b兩個jar包。其中a-b-c1.0 , d-e-f-c1.1 。由於c1.0路徑最短,所以專案test最後使用的是c1.0。

2.pom檔案中申明順序優先
有人就問了如果 a-b-c1.0 , d-e-c1.1 這樣路徑都一樣怎麼辦?其實maven的作者也沒那麼傻,會以在pom檔案中申明的順序那選,如果pom檔案中先申明瞭d再申明瞭a,test專案最後依賴的會是c1.1

所以maven依賴原則總結起來就兩條:路徑最短,申明順序其次。

二、如何解決Jar衝突
遇到衝突的時候第一步要找到maven載入的到時是什麼版本的jar包。通過mvn dependency:tree檢視依賴樹。

複製程式碼

[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ web-hsf ---
[INFO] com.lubby:web-hsf:war:0.0.1-SNAPSHOT
[INFO] +- org.apache.geronimo.specs:geronimo-servlet_3.0_spec:jar:1.0:compile
[INFO] +- org.springframework:spring:jar:2.5.6:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] +- com.taobao.hsf:hsf.dubbo.schema:jar:2.1.1.1:provided
[INFO] +- com.taobao.hsf:hsf.service.dubbo:jar:2.0.1.9:provided
[INFO] |  +- com.taobao.hsf:hsf.services:jar:2.0.1.9:provided
[INFO] |  |  +- org.slf4j:slf4j-api:jar:1.7.2:provided
[INFO] |  |  +- groovy:groovy-all:jar:1.1-rc-1:provided
[INFO] |  |  \- com.taobao.noah:noah-log:jar:0.0.1-SNAPSHOT:provided
[INFO] |  \- com.taobao.hsf:hsf.app.spring:jar:2.0.1.9:provided
[INFO] |     +- org.slf4j:slf4j-log4j12:jar:1.7.2:provided
[INFO] |     +- log4j:log4j:jar:1.2.17:provided
[INFO] |     +- commons-cli:commons-cli:jar:1.0:provided
[INFO] +- com.taobao.hsf:hsf-standalone:jar:2.0.4-SNAPSHOT:provided
[INFO] |  \- javax.servlet:servlet-api:jar:2.5:provided
[INFO] \- com.ali.unit.rule:unitrouter:jar:1.0.0:provided
[INFO]    \- com.taobao.diamond:diamond-client:jar:3.6.0:provided
[INFO]       \- com.taobao.diamond:diamond-utils:jar:3.1.2:provided
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.407s
[INFO] Finished at: Thu May 12 20:20:00 CST 2016
[INFO] Final Memory: 9M/265M
[INFO] ------------------------------------------------------------------------

複製程式碼

遇到衝突的時候通過maven的依賴原則來調整座標在pom檔案的申明順序是最好的辦法。

方法二:依賴設定為全域性使用

三、如何隔離一個Jar包
如何隔離一個jar包?有兩個方法。
第一個很常用的exclusion來隔離jar包。

<exclusions>
    <exclusion>
         <groupId>com.ibm.icu</groupId>
         <artifactId>icu4j</artifactId>
    </exclusion>
</exclusions>

第二個不常用的方法就是建立一個空包。
空包的座標和你需要隔離的Jar包座標一樣,deploy的公司的私服上面。專案中這個空包申明在pom檔案靠前的地方,這樣依據maven依賴原則,這個空包會優先被使用,後面所有無論是直接依賴還是間接依賴的相同座標的jar包都不會被使用了。
空包比exclusion的好處就是不用在所有間接依賴的地方去exclusion。

分類:maven

轉載於:https://my.oschina.net/airship/blog/3047693