事情起因
最近倒腾飞书机器人需要用到飞书开放平台sdk,于是将其接入到web工具服务中。此时不出意外地就出现意外了,启动服务的时候报错,报错详情如下
报错部分是内部的工具包,一开始有点疑惑。在想是不是办公室网络坏境问题导致连不上某些节点?开始使用IDEA进行断点,断点后发现内部工具引用的guava包某字段找不到。
这里就很奇怪了,断点地方是一直在使用、没有更新过的内部包,却突然报guava有问题。难道引入的飞书sdk干扰了guava版本?点击一看,内部包现在正在使用的guava正是飞书sdk所依赖的版本。
查看maven的依赖规则
(1) 最近优先原则(Nearest Wins)
Maven 会选择依赖树中路径最短的版本。
例如:
如果
A -> B -> C -> D (v1.0)
,而A -> E -> D (v2.0)
,Maven 会选择D (v2.0)
,因为它的路径更短。
(2) 最先声明原则(First Declaration Wins)
如果两个依赖的路径长度相同,Maven 会选择在
pom.xml
中先声明的依赖。
排查问题
在我的项目中并没有显式声明依赖,可以确定命中了最近优先原则。可以借助IDEA中的maven依赖分析工具
借助工具后发现,飞书sdk引入了高版本的guava并开启使用,其他包并不兼容这么高的版本,这就是问题所在。
如何解决问题?
因为两个包分别依赖不同版本的guava,需要隔离开。在这里,针对飞书的SDK引入的高版本guava做单独隔离。
在pom文件中使用 <exclusion>
解决,如下所示
<dependency>
<groupId>com.larksuite.oapi</groupId>
<artifactId>oapi-sdk</artifactId>
<version>2.4.11</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>