使用Jest客户端向AWS ElasticSearch写入数据时遇NoSuchMethodError求助
解决Jest写入AWS ElasticSearch时的NoSuchMethodError问题
这个问题我之前帮别人排查过,大概率是Guava版本冲突搞的鬼!Flink 1.3.x系列依赖的Guava版本比较老旧,而Jest客户端(或者它的底层依赖)需要的是更新版的Guava,两者的com.google.common.base.Preconditions.checkArgument方法签名不匹配,就抛出了这个NoSuchMethodError。
下面给你几个落地的解决方案:
1. 先排查清楚依赖冲突
先用sbt命令看看项目里Guava的依赖情况,到底是哪些包引入了不同版本:
sbt dependencyTree | grep guava
执行后你会发现,Flink相关依赖大概率带的是Guava 18.0左右的版本,而Jest那边需要的是20.0及以上的版本,这就是冲突根源。
2. 强制统一Guava版本
最简单的办法是在你的sbt依赖配置里,强制指定一个兼容两边的Guava版本,比如20.0:
libraryDependencies ++= Seq( // 你的现有依赖... "org.apache.flink" % "flink-core" % "1.3.2", "org.apache.flink" % "flink-scala_2.11" % "1.3.2", "org.apache.flink" % "flink-streaming-scala_2.11" % "1.3.2", "org.apache.flink" % "flink-shaded-hadoop2" % "1.4.0", "org.apache.flink" %% "flink-yarn" % "1.3.2", "com.typesafe.play" %% "play-json" % "2.6.2", "org.apache.flink" % "flink-clients_2.11" % "1.3.2", // 新增强制Guava版本 "com.google.guava" % "guava" % "20.0" force() )
force()关键字会让sbt忽略所有其他依赖引入的Guava版本,统一用你指定的这个版本,直接解决冲突。
3. 手动排除冲突的旧版Guava
如果强制版本后遇到其他兼容问题,也可以手动从Flink的依赖里把旧Guava排除掉,再引入新版本:
libraryDependencies ++= Seq( "org.apache.flink" % "flink-core" % "1.3.2" exclude("com.google.guava", "guava"), "org.apache.flink" % "flink-scala_2.11" % "1.3.2" exclude("com.google.guava", "guava"), "org.apache.flink" % "flink-streaming-scala_2.11" % "1.3.2" exclude("com.google.guava", "guava"), "org.apache.flink" % "flink-shaded-hadoop2" % "1.4.0" exclude("com.google.guava", "guava"), "org.apache.flink" %% "flink-yarn" % "1.3.2" exclude("com.google.guava", "guava"), "com.typesafe.play" %% "play-json" % "2.6.2", "org.apache.flink" % "flink-clients_2.11" % "1.3.2" exclude("com.google.guava", "guava"), // 引入统一的新版本Guava "com.google.guava" % "guava" % "20.0", // 确保Jest版本兼容Scala 2.11 "io.searchbox" % "jest" % "5.3.3" )
这种方式更灵活,能精准控制每个依赖的引入内容。
额外小提示
- 可以用
sbt dependencyUpdates命令检查所有依赖的版本更新情况,提前规避一些潜在的版本冲突。 - 先在本地环境测试验证依赖冲突解决后,再部署到Yarn集群,避免集群环境的依赖干扰。
内容的提问来源于stack exchange,提问作者Chengzhi
相关产品推荐
相关产品推荐

