解决maven依赖冲突方法

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...

猜你喜欢

转载自blog.csdn.net/qq_34964197/article/details/80901001