maven依赖原则
2016-05-18 11:11
411 查看
使用maven的程序员都会遇到一个问题,那就是maven依赖冲突的问题,这会导致ClassNotFound或者MethodNotFound这样的异常。其实只要明白maven依赖的根本性的原则就不怕这样的问题了。
2.pom文件中申明顺序优先
有人就问了如果 a-b-c1.0 , d-e-c1.1 这样路径都一样怎么办?其实maven的作者也没那么傻,会以在pom文件中申明的顺序那选,如果pom文件中先申明了d再申明了a,test项目最后依赖的会是c1.1
所以maven依赖原则总结起来就两条:路径最短,申明顺序其次。
遇到冲突的时候通过maven的依赖原则来调整坐标在pom文件的申明顺序是最好的办法。
第一个很常用的exclusion来隔离jar包。
第二个不常用的方法就是创建一个空包。空包的坐标和你需要隔离的Jar包坐标一样,deploy的公司的私服上面。项目中这个空包申明在pom文件靠前的地方,这样依据maven依赖原则,这个空包会优先被使用,后面所有无论是直接依赖还是间接依赖的相同坐标的jar包都不会被使用了。空包比exclusion的好处就是不用在所有间接依赖的地方去exclusion。
一、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包。通过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。
相关文章推荐
- java当中的定时器的4种使用方式
- 浅谈WebLogic和Tomcat
- MST implementation with Kruskal and Boruvka algorithm
- filter优先级
- soot插桩关键点总结(三)
- Redis + Django Session Cookie
- 重新学习《C++Primer5》第11章-关联容器
- 关于子函数中用new的问题
- C++的iostream标准库介绍+使用详解(转)
- 浏览器兼容处理(HTML条件注释、CSSHack和JS识别)
- 敏捷软件开发(1)--- STATE 模式
- SQL中分页与distinct冲突解决方案
- ruby关于flip-flop理解上一个注意点
- iPhone 应用开发的5个贴士
- BackTracking
- 解决java.lang.IllegalArgumentException: pointerIndex out of range 或者 arrayindexoutofboundsexception的错误
- 消息模型
- perl 使用SUPER类来访问覆盖的方法
- Android Gradle配置Debug和release参数的方法
- 计算机网络常识(摘抄)