maven依赖的原则:
1、间接依赖路径最短优先
一个项目依赖了a、b两个jar包,其中a-b-c1.0,x-y-z-c1.1,由于c1.0路径最短,所以项目test最后使用的是c1.0。
2、pom.xml文件中申明顺序
两个路径一样长的话,那么以pom文件的申明顺序为准,如果先声明x再声明a,则test项目最终使用的是c1.1。
如果项目报错:NoClassDefFoundError, NoSuchMethodError,此时需要检查导入的包是否冲突。
那么应该如何定位冲突原因呢?
1、找到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] ------------------------------------------------------------------------
如果想要查看所有的依赖传递,可以加一个-Dverbose参数,但是这样显示的信息太多了,需要过滤一下。过滤串使用groupId:artifactId:version的方式进行过滤
mvn dependency:tree -Dverbose -Dincludes=com.mogujie.trade:trade.base.response
2、
同一个jar包但groupId, artifactId不同,这种冲突只能通过设定依赖的<exclusions> 来进行排除
<dependency>
<groupId>org.unitils</groupId>
<artifactId>unitils-dbmaintainer</artifactId>
<version>${unitils.version}</version>
<!-- 这个就是我们要加的代码 把不需要的包排出去-->
<exclusions>
<exclusion>
<artifactId>dbunit</artifactId>
<groupId>org.dbunit</groupId>
</exclusion>
<!-- 这个就是我们要加的代码 -->
</dependency>
解决方法有四种
1、第一声明优先原则
<dependencies>
<!-- spring-beans-4.2.4 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<!-- spring-beans-3.0.5 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
</dependency>
2、路径近者优先原则
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
3、排除原则
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.24</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
4、版本锁定原则
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
<hibernate.version>5.0.7.Final</hibernate.version>
<struts.version>2.3.24</struts.version>
</properties>
<!-- 锁定版本,struts2-2.3.24、spring4.2.4、hibernate5.0.7 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
以上。
To be continued...