如何修复由两个名称相同但版本不同的相同jar引起的错误?

时间:2019-01-07 11:32:44

标签: maven consul

在该项目中,有两个模块:数据和基础结构。

  1. 数据模块使用Google提供的grpc插件:grpc-protobuf,它引用com.google.guava:guava [version:26.0-android]。

  2. 基础结构模块使用consul的插件:consul-client,它引用com.google.guava:guava [version:22.0]。

数据模块取决于基础结构模块。

在编译时没有问题,但是在运行时,consul客户端中的ConsulCache会调用com.google.guava:guava中的Stopwatch.elapsed()方法,而com.google.guava中没有参数: guava:22.0和com.google.guava:guava:26.0-android中的参数化。 ConsulCache始终指向com.google.guava:guava:26.0-android而不是com.goog.guava:guava:22.0,它将报告以下异常:

java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.elapsed()Ljava/time/Duration;
at com.orbitz.consul.cache.ConsulCache$1.onComplete(ConsulCache.java:103)

因为这是一个Maven项目,并且全部涉及自动管理jar包,所以它会由第三方插件本身自动引用。

如何在不修改其源代码的情况下解决此异常?

1 个答案:

答案 0 :(得分:0)

首先,您需要确定要使用22.0版还是26.0-android版。

然后,将<dependencyManagment>条目添加到poms(或公用父pom,甚至更好)中,以管理com.google.guava:guava到所需的版本。

dependencyManagement(https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management)会覆盖该依赖项的所有可传递找到的版本号。因此,您只会获得选择的版本。