使用SBT导入Spark 2.2.0时出现依赖解析异常求助
我来帮你分析下你遇到的这个问题:sbt.librarymanagement.ResolveException: unresolved dependency: org.apache.spark#spark-core_2.12;2.2.0: not found,核心原因其实很简单——Spark 2.2.0根本就不支持Scala 2.12!
Spark从2.3.0版本才开始提供针对Scala 2.12的编译包,而2.2.0只支持Scala 2.11.x系列。你明明在build.sbt里指定了scalaVersion := "2.11.5",却出现了查找_2.12版本的错误,大概率是依赖写法或者配置冲突导致的,下面给你具体的解决步骤:
1. 修正Spark依赖的写法
在sbt中,如果你想让依赖自动匹配当前项目的Scala版本,一定要用%%而不是%。比如把你的Spark依赖改成这样:
libraryDependencies += "org.apache.spark" %% "spark-core" % "2.2.0"
这里的%%会自动根据你设置的scalaVersion := "2.11.5",转换成spark-core_2.11,也就是Spark 2.2.0支持的正确版本。
如果之前你是手动写的"org.apache.spark" % "spark-core_2.12" % "2.2.0",那直接删掉_2.12换成%%就行。
2. 检查Scala版本是否存在冲突
有时候项目的其他配置(比如project/plugins.sbt里的插件)可能会强制指定Scala 2.12,导致sbt忽略你在build.sbt里设置的版本。你可以检查下这些文件,确保没有其他地方覆盖了scalaVersion。
3. 添加可靠的仓库源
虽然Spark的依赖默认在Maven中央仓库,但偶尔会有镜像同步延迟的问题,你可以在build.sbt里加上Apache官方仓库来确保能找到依赖:
resolvers ++= Seq( Resolver.sonatypeRepo("snapshots"), "Apache Maven Repository" at "https://repo.maven.apache.org/maven2/" )
完整的build.sbt示例
最后给你一个调整后的完整build.sbt参考(记得补上你原来的guice等依赖):
name := """play-scala-starter-example""" version := "1.0-SNAPSHOT" lazy val root = (project in file(".")).enablePlugins(PlayScala) resolvers ++= Seq( Resolver.sonatypeRepo("snapshots"), "Apache Maven Repository" at "https://repo.maven.apache.org/maven2/" ) scalaVersion := "2.11.5" libraryDependencies ++= Seq( guice, // 这里用%%自动匹配Scala版本,加上Provided是因为集群环境通常已经有Spark依赖,避免打包冲突 "org.apache.spark" %% "spark-core" % "2.2.0" % Provided )
内容的提问来源于stack exchange,提问作者JeyJ

