【问题标题】:Handling multiple versions of same library in SBT在 SBT 中处理同一库的多个版本
【发布时间】:2019-01-14 08:26:11
【问题描述】:

我在 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 in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

通过谷歌搜索,我发现这是因为我的类路径中有多个版本的Guava

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

"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 jars。

我的问题是,在排除番石榴之前,由于类路径中存在多个版本而出现错误,怎么可能在排除其中一个版本时出现未找到番石榴罐子的错误。

如何解决此错误。

【问题讨论】:

    标签: scala apache-spark sbt guava


    【解决方案1】:

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

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

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

    或在 SBT 控制台中查看eviction warnings

    【讨论】:

      最近更新 更多