Apache spark Spark/Wiremock:guava版本冲突

Apache spark Spark/Wiremock:guava版本冲突,apache-spark,sbt,guava,wiremock,Apache Spark,Sbt,Guava,Wiremock,在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" %% "scalat

在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
执行此操作时,spark类出现以下错误:

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")
java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;
因为默认的guava版本是11.0.2

使用Guava18,它引入了
createStarted
方法,我仍然有错误
试图访问方法com.google.common.base.Stopwatch。


所以问题是两个图书馆使用不兼容的番石榴。如何修复它?我找到的解决方案与uber jar相关,但在我的案例中,这只是测试范围内的

使用wiremock独立库解决了这个问题:

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

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

使用wiremock独立库解决了这个问题:

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

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

如何解决?请您使用的库的维护人员将其Guava版本更新为最新版本,并使用这些库的最新版本。我在Google平台上使用Spark,我没有可用版本的选择。Wiremock 2.25.1依赖Guava 20(3年版本),Spark 2.4.4依赖Guava 14(6.5年版本)但他们在评论中说有15条(6年前的版本)。两者都需要更新。欢迎来到地狱!由于它们不在同一范围内使用,我现在只想删除wiremock。。。。如果我可以,那么我会。。。但我需要知道如何修复它?请您使用的库的维护人员将其Guava版本更新为最新版本,并使用这些库的最新版本。我在Google平台上使用Spark,我没有可用版本的选择。Wiremock 2.25.1依赖Guava 20(3年版本),Spark 2.4.4依赖Guava 14(6.5年版本)但他们在评论中说有15条(6年前的版本)。两者都需要更新。欢迎来到地狱!由于它们不在同一范围内使用,我现在只想删除wiremock。。。。如果我可以,那么我会。。。但我需要Wiremockwiremock独立版在一个新的wiremock包下重新打包尽可能多的依赖项——例如,它的jar中有
wiremock.com.google.common.base.Stopwatch
,这取决于此。一种称为着色的过程。因此不再有冲突,就JVM而言,
wiremock.com.google.common.base.Stopwatch
com.google.common.base.Stopwatch
是两个完全不同的类,因此它们可以共存。wiremock-standalone在一个新的wiremock包下重新打包尽可能多的依赖项,例如它有
wiremock.com.google.common.base.Stopwatch
在它的jar中,这取决于它。一种称为着色的过程。因此,就JVM而言,不再存在冲突
wiremock.com.google.common.base.Stopwatch
com.google.common.base.Stopwatch
是两个完全不同的类,因此它们可以共存。