在该项目中,有两个模块:数据和基础结构。
数据模块使用Google提供的grpc插件:grpc-protobuf,它引用com.google.guava:guava [version:26.0-android]。
基础结构模块使用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包,所以它会由第三方插件本身自动引用。
如何在不修改其源代码的情况下解决此异常?
答案 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)会覆盖该依赖项的所有可传递找到的版本号。因此,您只会获得选择的版本。