1.問題描述:
? ? ? 使用alibaba微服務(wù)體系搭建的項目,模塊管理使用的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.問題排查思路
首先,查看錯誤日志,錯誤日志中英文的大體翻譯為,“嘗試調(diào)用了一個不存在方法,發(fā)生的位置在?DefaultModelDependencyProvider類中,下面這個方法不存在,可能方法存在....,guava-19.0.jar包中"
然后從錯誤日志中我們就可以分析出,由于guava-19.0這個jar引起的,并且報出的錯誤是某個方法不存在,那么我們就可以考慮到是這個jar的版本太低了,但是和swagger有什么關(guān)系那?那這個時候我們可以想到swagger有沒有使用guava,打開編譯器,查看swagger的包依賴關(guān)系:
使用idea的可以這樣操作,右側(cè)---》maven--->選中需要分析依賴的項目---》maven最上方有個show depenceies--->然后打開下面這張圖--》左上角有個有 show conflicts--》紅線就是有沖突的依賴--》放大就會發(fā)現(xiàn)如第二張圖 swagger也依賴了guava,并且要求20.0的版本。


4.根本原因
maven的父子模塊包依賴機制導(dǎo)致,父子項目依賴關(guān)系如下:
Maven 父子POM文件 相同依賴不同版本的問題 :默認(rèn)用父一級的版本而且子POM文件的版本處會有黃色Warn,但是子項目增加<version>以后,就會使用子項目的版本。
我們的項目就是在 父項目中引入的swagger,里面的swagger自己引入了20.0以上版本的guava使用,但是我們在子項目中又添加了如下依賴:
<dependency>
? ? ?<groupId>com.google.guava</groupId>
? ? ? <artifactId>guava</artifactId>
? ? ? <version>19.0</version>
</dependency>
導(dǎo)致父項目的guava版本被覆蓋成了19.0的低版本,所以無法找到swagger使用的某個方法了。