【问题标题】:Cross-version suffixes in SBT with regards to scala-xmlSBT 中关于 scala-xml 的跨版本后缀
【发布时间】:2017-05-28 02:31:08
【问题描述】:

我是 Scala 和 SBT 的新手,为了学习新的东西,我正在尝试阅读 "Building a recommendation engine with Scala" 这本书。本书中引用的示例库现在已被更高版本替换,或者在某些情况下似乎被不同技术(casbah 到 Mongo Scala 驱动程序)所取代。这导致我生成了一些可能不正确的 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

我尝试按照this link 建议的一些示例进行操作,这些示例是我在一些 Gitter 对话here 中找到的。在这一点上,这些建议都超出了我的理解。

我通过将构建文件修改为如下所示,通过反复试验设法解决了该错误;

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 以克服这一点,但同时也有点令人沮丧。

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    tl;dr:你不能使用 Scala 2.12,因为 Spark 还不支持它,你还需要在指定依赖项时使用 %% 以避免二进制版本不正确的问题。阅读下文了解更多说明。

    像 2.x 这样的 Scala 版本是二进制不兼容的,因此必须为每个这样的版本单独编译所有库(当前使用的是 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 库。

    但是,在您的情况下,问题是您想使用 Scala 2.12,但您试图提取为 Scala 2.11 编译的 Spark。在理想的世界中,正确的解决方案是对所有依赖项使用%%,因此将使用它们与 2.12 兼容的工件,但是,尚未针对 Scala 2.12 发布 Spark 工件(一些问题会阻止 Spark 在 2.12 上保持稳定) , 就目前我所记得的)。因此,您应该将 Scala 版本更改为 2.11.11(2.11 分支中的最后一个 Scala 版本),然后去掉工件名称中的 _2.11/_2.12 后缀,改用 %%。那么它应该可以工作了。

    【讨论】:

    • 非常感谢您提供的信息。我会在接下来的几天里尝试你的建议。我也一直在 Scala IDE/Eclipse 下进行编辑,我认为它是使用 2.11 编译的,并且似乎可以在那里编译。也许这就是原因。
    • 作为更新,我已按照您的说明修改了构建脚本,效果很好。再次感谢。
    【解决方案2】:

    这是版本冲突异常


    这里您使用的是带有 scala 2.11“spark-streaming_2.11”的 spark 库,因此将 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"
    

    【讨论】:

      猜你喜欢
      • 2013-10-15
      • 2014-08-29
      • 2014-08-29
      • 2021-12-24
      • 2023-04-04
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多