【问题标题】:Spark / Wiremock: guava version conflictSpark / Wiremock:番石榴版本冲突
【发布时间】:2020-03-10 05:51:06
【问题描述】:

在 Spark 应用程序 (v2.3.3) 中,我想使用 Scala 测试中的 Wiremock。我使用以下依赖项:

"org.apache.spark" %% "spark-sql" % "2.3.3" % "provided"
"org.apache.spark" %% "spark-mllib" % "2.3.3" % "provided"
"com.github.tomakehurst" % "wiremock" % "2.25.1" % Test
"org.scalatest" %% "scalatest" % "2.2.5" % Test

这样做,火花类出现以下错误:

java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapred.FileInputFormat
at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:312)
at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:200)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:251)
at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:46)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:253)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:251)
at org.apache.spark.rdd.RDD$$anonfun$toLocalIterator$1.apply(RDD.scala:962)
at org.apache.spark.rdd.RDD$$anonfun$toLocalIterator$1.apply(RDD.scala:958)
at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)
at org.apache.spark.rdd.RDD.withScope(RDD.scala:363)
at org.apache.spark.rdd.RDD.toLocalIterator(RDD.scala:958)

如果我从 Wiremock 中排除番石榴:

"com.github.tomakehurst" % "wiremock" % "2.25.1" % Test exclude("com.google", "guava")

我使用 Wiremock 得到以下信息:

java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;

因为默认 guava 版本是 11.0.2 。

使用引入createStarted方法的guava 18,我仍然有错误tried to access method com.google.common.base.Stopwatch.&lt;init&gt;

所以问题是 2 个库使用不兼容的 Guava 版本。如何解决?我找到的解决方案与 uber-jar 有关,但在我的情况下,这只是 在测试范围内

【问题讨论】:

  • 如何解决?要求您使用的库的维护者将他们的 Guava 版本更新到最新版本,并使用这些库的最新版本。
  • 我在 Google 平台上使用 Spark,我无法选择可用的版本。
  • Wiremock 2.25.1 依赖于 Guava 20(一个 3 岁的版本),Spark 2.4.4 依赖于 Guava 14(一个 6.5 岁的版本),但他们说 cmets 中的 15(一个 6 岁的版本)版本)。两者都需要更新。欢迎来到依赖地狱!由于它们没有在同一范围内使用,所以我现在只删除wiremock。
  • ...如果可以的话,我会...但我需要 Wiremock

标签: apache-spark sbt guava wiremock


【解决方案1】:

使用wiremock-standalone库解决了这个问题:

"com.github.tomakehurst" % "wiremock-standalone" % "2.25.1" % Test

我真的不明白为什么,如果有人有解释?

【讨论】:

  • wiremock-standalone 在新的wiremock 包下尽可能多地重新打包其依赖项——例如,它的jar 中有wiremock.com.google.common.base.Stopwatch,并且依赖于它。称为着色的过程。所以不再有冲突,就 JVM 而言,wiremock.com.google.common.base.Stopwatchcom.google.common.base.Stopwatch 是两个完全不同的类,因此它们可以共存。
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 2014-11-10
  • 2018-08-15
  • 2016-09-04
  • 2017-11-07
  • 1970-01-01
  • 2014-02-12
相关资源
最近更新 更多