在SBT中处理同一个库的多个版本

时间:2019-01-14 08:26:12

标签: scala apache-spark sbt guava

我在Scala中有一个Spark项目,我试图在其中使用google-cloud-storage依赖项。以下是build.sbt

添加的依赖项
val sparkVersion  = "2.2.0"
"org.apache.spark" %% "spark-core" % sparkVersion % "provided",
"org.apache.spark" %% "spark-sql" % sparkVersion % "provided",
"com.google.cloud" % "google-cloud-storage" % "1.55.0",
"com.typesafe" % "config" % "1.3.1"

现在,当我构建jar并运行它时,我会遵循Exception。

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

在谷歌搜索时,我发现这是由于我的类路径上的Guava的多个版本引起的。

为解决此问题,我从Guava依赖项中排除了google-cloud-storage

"com.google.cloud" % "google-cloud-storage" % "1.55.0" exclude("com.google.guava", "guava"),

但是随后出现以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/google/cloud/storage/StorageOptions

此错误意味着现在在类路径中没有Guava个jar。

我的问题是,在排除番石榴之前,由于在classpath上存在多个版本而导致错误,怎么可能?排除一个版本时,为什么没有找到番石榴罐错误呢?

如何解决此错误。

1 个答案:

答案 0 :(得分:2)

您可以尝试将guava依赖项添加为显式依赖项:

libraryDependencies +=  "com.google.guava" % "guava" % "newest_version"  

要找出最新版本,可以使用以下插件:sbt-dependency-graph

或在SBT控制台中检查eviction warnings

相关问题