记一次Maven Jar包冲突问题

引入一个工具依赖到项目中

然后启动就报错了

***************************

APPLICATION FAILED TO START

***************************

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    springfox.documentation.spring.web.scanners.ApiListingScanner.scan(ApiListingScanner.java:117)

The following method did not exist:

    com.google.common.collect.FluentIterable.append(Ljava/lang/Iterable;)Lcom/google/common/collect/FluentIterable;

The method’s class, com.google.common.collect.FluentIterable, is available from the following locations:

    jar:file:/C:/home/yizhenn/.m2/repository/com/google/guava/guava/16.0.1/guava-16.0.1.jar!/com/google/common/collect/FluentIterable.class

The class hierarchy was loaded from the following locations:

    com.google.common.collect.FluentIterable: file:/C:/home/yizhenn/.m2/repository/com/google/guava/guava/16.0.1/guava-16.0.1.jar

Action:

Correct the classpath of your application so that it contains a single, compatible version of com.google.common.collect.FluentIterable

从上面可以知道

  1. 发生异常的位置
  2. 找不到目标方法的异常类
  3. 加载异常类的位置(引入guava是16.0版本的)

手动去在项目中找目标类,的确是没有这个方法

查看POM 文件依赖结构

发现guava包存在冲突

Maven 依赖的优先级根据依赖树的深度排序

依赖链路越短,那么加载的优先级越高

观察下guava这个依赖情况

异常的位置是swagger,但是我在项目中到处也没找到swagger的依赖,后面一看,原来是引入美化版的swagger,然后swagger后面再去引入guava。

我引入的工具包easy-poi,子包base直接就引入了16版本的guava

而美化版本的swagger引用的guava层级十分的深,因此由16版本的guava优先引入。

而美化版本的swagger使用了20版本guava包内的方法,而旧版本16没有这个方法,因此swagger的执行的时候会产生异常,

解决方法: 引入easy-poi的时候排除guava,寄托高版本guava能够兼容低版本guava,让easypoi调用guava的时候不会产生异常

有人会说,如果就那么不好彩, 高版本的guava不兼容低版本的guava(具体表现为方法被弃用了, 没这个方法,或者改包名了咋办)

那就是不兼容咯,不兼容就是不兼容,没办法,自己找能够兼容的版本呗哈哈哈哈哈

发表评论

电子邮件地址不会被公开。 必填项已用*标注