我对Scala和SBT都很陌生,为了学习一些新的东西,我正试着阅读““用Scala构建推荐引擎””一书。书中引用的示例库现在已被更晚的版本所取代,或者在某些情况下似乎被不同的技术所取代(casbah to Mongo驱动程序)。这导致我产生了一些可能不正确的SBT构建文件。在我最初的构建文件中,我有;
name := "BuildingScalaRecommendationEngine"
scalaVersion := "2.12.1"
version :="1.0"
libraryDependencies += "org.apache.spark" % "spark-mllib_2.11" % "2.1.0"
libraryDependencies += "org.apache.spark" % "spark-streaming_2.11" % "2.1.1"
libraryDependencies += "org.mongodb.scala" %% "mongo-scala-driver" % "2.1.0"
libraryDependencies += "org.apache.kafka" % "kafka_2.12" % "0.10.2.0"
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.1" 这导致了一个构建错误,类似;
[error] Modules were resolved with conflicting cross-version suffixes in {file:/C:/Dev/learning/scala/Tutorial/src/}src:
[error] org.scala-lang.modules:scala-xml _2.11, _2.12
java.lang.RuntimeException: Conflicting cross-version suffixes in: org.scala-lang.modules:scala-xml我尝试了一些例子,如在此链接上建议的,这是我在一些Gitter会话这里上发现的。然而,在这一点上,这些建议都超出了我的理解。
我设法通过修改我的构建文件来解决错误,主要是通过尝试和错误,如下所示;
name := "BuildingScalaRecommendationEngine"
scalaVersion := "2.12.1"
version :="1.0"
libraryDependencies += "org.apache.spark" % "spark-mllib_2.11" % "2.1.0" excludeAll(
ExclusionRule(organization = "org.scala-lang.modules")
)
libraryDependencies += "org.apache.spark" % "spark-streaming_2.11" % "2.1.1" excludeAll(
ExclusionRule(organization = "org.scala-lang.modules")
)
libraryDependencies += "org.mongodb.scala" %% "mongo-scala-driver" % "2.1.0" excludeAll(
ExclusionRule(organization = "org.scala-lang.modules")
)
libraryDependencies += "org.apache.kafka" % "kafka_2.12" % "0.10.2.0" excludeAll(
ExclusionRule(organization = "org.scala-lang.modules")
)
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.1" excludeAll(
ExclusionRule(organization = "org.scala-lang.modules")
)我可以用我的原始构建文件做些什么来避免这个错误吗?
库依赖值的组合是否首先导致了这种情况?
我的目标是更好地理解Scala和SBT,以克服这一问题,但在此期间,这有点令人沮丧。
发布于 2017-05-28 03:36:41
tl;dr:您不能使用Scala2.12,因为Spark还不支持它,而且您还需要在指定依赖项时使用%%,以避免出现不正确的二进制版本的问题。如需更多解释,请阅读下面。
Scala版本(如2.x )是二进制不兼容的,因此所有库都必须为每个这样的版本分别编译(2.10、2.11和2.12是当前使用的版本,尽管2.10正在成为遗留版本)。这就是_2.12 _2.11后缀的意义所在。
当然,您不能使用为Scala的不同版本编译的库,而不是当前使用的库。因此,如果将scalaVersion设置为,比方说,2.12.1,则不能使用以_2.11后缀的名称的库。这就是为什么可以编写"groupName" % "artifactName"和"groupName" %% "artifactName"的原因:在后一种情况下,当您使用双百分号时,当前Scala二进制版本将自动添加到名称中:
scalaVersion := "2.12"
"groupName" %% "artifactName" % "version"
==
"groupName" % "artifactName_2.12" % "version"因此,在99%的情况下,您希望设置一次Scala版本,然后使用%%操作符指定Scala库。
但是,在您的例子中,问题在于您想要使用Scala2.12,但是您正在尝试使用为Scala2.11编译的Spark。在理想的世界中,正确的解决方案将是对所有依赖项使用%%,因此将使用与其2.12兼容的工件,然而,Spark工件尚未发布到Scala2.12(据我所知,有些问题会阻止Spark在2.12上保持稳定)。因此,您应该将Scala版本更改为2.11.11 ( 2.11分支中的最后一个Scala版本),然后去掉工件名称中的_2.11/_2.12后缀,转而使用%%。那就应该管用了。
发布于 2018-10-01 06:50:25
这是版本冲突异常。
这里您使用了scala 2.11“火花流_2.11”星火库,因此将scala版本从2.12.1更改为2.11.X,以避免此版本冲突异常。
使用以下类型的sbt
name := "BuildingScalaRecommendationEngine"
scalaVersion := "2.11.6"
version :="1.0"
libraryDependencies += "org.apache.spark" % "spark-mllib_2.11" % "2.1.0"
libraryDependencies += "org.apache.spark" % "spark-streaming_2.11" % "2.1.1"
libraryDependencies += "org.mongodb.scala" %% "mongo-scala-driver" % "2.1.0"
libraryDependencies += "org.apache.kafka" % "kafka_2.12" % "0.10.2.0"
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.1"https://stackoverflow.com/questions/44223299
复制相似问题