概述

最近在项目中碰到了Jar包冲突的问题,比如一个组件A依赖了组件B的1.0版本,组件C依赖了组件B的2.0版本,我们如果是使用Maven进行依赖管理的时候,Maven会根据一些策略来舍弃掉组件B的某一个版本。下面我总结了Maven的一些依赖冲突的时的处理策略。 最短路径原则 比如上面提到的场景,组件A和组件C对组件B的路径分别为:

A(1.0) ---> X(1.0) ---> B(1.0) 
C(1.0) ---> B (2.0) 

那么Maven会计算出哪个是最短的依赖路径,就会优先加载,这个例子中,会加载组件B的2.0版本。 最先声明原则

如果组件B的1.0和2.0版本依赖的路径相同,此时怎么办?比如下面的依赖路径:

A (1.0) ---> B (1.0)  
C (1.0) ---> B (2.0) 

在这个场景中,Maven会分析出哪个组件是最先被声明的,比如下面的声明方式:

<dependencies>
    <dependency> 
           <artifactId>A</artifactId>
           <groupId>com.group.A</groupId>
           <version>x.y</version>
    </dependency>
    <dependency>
           <artifactId>C</artifactId>
           <groupId>com.group.C</groupId>
           <version>x.y</version>
     </dependency>
</dependencies>

A被优先声明了,所以Maven会优先加载A的间接依赖:组件B 1.0版本,而不会加载组件B的2.0版本。

问题

基于如上的Maven依赖策略,思考了如下的一些问题:

1.如果组件B的2.0版本和1.0版本之间不兼容怎么办? 不兼容的意思具体是指,比如组件A依赖的组件B的方法1,但是方法1在组件B的2.0中被删除了,这样不管是使用上述Maven的哪种依赖策略都不能解决问题;

2.我们在项目开发的时候,如果使用Maven进行依赖管理,很多依赖是被间接引入到项目中去的,这些间接引入的依赖如果发生的步骤1的问题,我们如何能够快速识别和解决?