首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于scala-xml,SBT中的跨版本后缀

关于scala-xml,SBT中的跨版本后缀
EN

Stack Overflow用户
提问于 2017-05-28 02:31:08
回答 2查看 4.2K关注 0票数 3

我对Scala和SBT都很陌生,为了学习一些新的东西,我正试着阅读““用Scala构建推荐引擎””一书。书中引用的示例库现在已被更晚的版本所取代,或者在某些情况下似乎被不同的技术所取代(casbah to Mongo驱动程序)。这导致我产生了一些可能不正确的SBT构建文件。在我最初的构建文件中,我有;

代码语言:javascript
复制
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" 

这导致了一个构建错误,类似;

代码语言:javascript
复制
[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会话这里上发现的。然而,在这一点上,这些建议都超出了我的理解。

我设法通过修改我的构建文件来解决错误,主要是通过尝试和错误,如下所示;

代码语言:javascript
复制
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,以克服这一问题,但在此期间,这有点令人沮丧。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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二进制版本将自动添加到名称中:

代码语言:javascript
复制
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后缀,转而使用%%。那就应该管用了。

票数 4
EN

Stack Overflow用户

发布于 2018-10-01 06:50:25

这是版本冲突异常。

这里您使用了scala 2.11“火花流_2.11”星火库,因此将scala版本从2.12.1更改为2.11.X,以避免此版本冲突异常。

使用以下类型的sbt

代码语言:javascript
复制
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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44223299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档