使用maven的程序員都會遇到一個問題,那就是maven依賴衝突的問題,這會致使ClassNotFound或者MethodNotFound這樣的異常。其實只要明白maven依賴的根本性的原則就不怕這樣的問題了。java
一個項目test依賴了a和b兩個jar包。其中a-b-c1.0 , d-e-f-c1.1 。因爲c1.0路徑最短,因此項目test最後使用的是c1.0。程序員
2.pom文件中申明順序優先web
有人就問了若是 a-b-c1.0 , d-e-c1.1 這樣路徑都同樣怎麼辦?其實maven的做者也沒那麼傻,會以在pom文件中申明的順序那選,若是pom文件中先申明瞭d再申明瞭a,test項目最後依賴的會是c1.1spring
因此maven依賴原則總結起來就兩條:路徑最短,申明順序其次。apache
遇到衝突的時候第一步要找到maven加載的到時是什麼版本的jar包。經過dependency:tree查看依賴樹。api
[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文件的申明順序是最好的辦法。app
如何隔離一個jar包?有兩個方法。maven
第一個很經常使用的exclusion來隔離jar包。ide
<exclusions> <exclusion> <groupId>com.ibm.icu</groupId> <artifactId>icu4j</artifactId> </exclusion> </exclusions>
第二個不經常使用的方法就是建立一個空包。空包的座標和你須要隔離的Jar包座標同樣,deploy的公司的私服上面。項目中這個空包申明在pom文件靠前的地方,這樣依據maven依賴原則,這個空包會優先被使用,後面全部不管是直接依賴仍是間接依賴的相同座標的jar包都不會被使用了。空包比exclusion的好處就是不用在全部間接依賴的地方去exclusion。spa