1.问题描述:
使用alibaba微服务体系搭建的项目,模块管理使用的maven,给项目引入swagger做接口文档,启动时报错,报错信息如下:
An attempt was made to call a method that does not exist. The attempt was made from the following location: springfox.documentation.schema.DefaultModelDependencyProvider.dependentModels(DefaultModelDependencyProvider.java:79)
The following method did not exist: com.google.common.collect.FluentIterable.concat(Ljava/lang/Iterable;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:/maven/repository/com/google/guava/guava/19.0/guava-19.0.jar!/com/google/common/collect/FluentIterable.classIt was loaded from the following location: file:/C:/maven/repository/com/google/guava/guava/19.0/guava-19.0.jar
2.问题解决
升级guava版本为20.0以上。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
3.问题排查思路
首先,查看错误日志,错误日志中英文的大体翻译为,“尝试调用了一个不存在方法,发生的位置在 DefaultModelDependencyProvider类中,下面这个方法不存在,可能方法存在....,guava-19.0.jar包中"
然后从错误日志中我们就可以分析出,由于guava-19.0这个jar引起的,并且报出的错误是某个方法不存在,那么我们就可以考虑到是这个jar的版本太低了,但是和swagger有什么关系那?那这个时候我们可以想到swagger有没有使用guava,打开编译器,查看swagger的包依赖关系:
使用idea的可以这样操作,右侧---》maven--->选中需要分析依赖的项目---》maven最上方有个show depenceies--->然后打开下面这张图--》左上角有个有 show conflicts--》红线就是有冲突的依赖--》放大就会发现如第二张图 swagger也依赖了guava,并且要求20.0的版本。
4.根本原因
maven的父子模块包依赖机制导致,父子项目依赖关系如下:
Maven 父子POM文件 相同依赖不同版本的问题 :默认用父一级的版本而且子POM文件的版本处会有黄色Warn,但是子项目增加<version>以后,就会使用子项目的版本。
我们的项目就是在 父项目中引入的swagger,里面的swagger自己引入了20.0以上版本的guava使用,但是我们在子项目中又添加了如下依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
导致父项目的guava版本被覆盖成了19.0的低版本,所以无法找到swagger使用的某个方法了。