Administrator
发布于 2025-04-09 / 2 阅读
0
0

Maven项目的依赖冲突问题

事情起因

最近倒腾飞书机器人需要用到飞书开放平台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>


评论