【问题标题】:Warnings while building Scala/Spark project with SBT使用 SBT 构建 Scala/Spark 项目时的警告
【发布时间】:2018-01-13 19:58:38
【问题描述】:

我正在尝试使用以下build.sbt 在 IntelliJ Idea 中构建 Scala/Spark 项目:

name := "try"

version := "1.0"

scalaVersion := "2.11.8"

val sparkVersion = "2.2.0"

resolvers ++= Seq(
  "apache-snapshots" at "http://repository.apache.org/snapshots/"
)

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % sparkVersion,
  "org.apache.spark" %% "spark-sql" % sparkVersion,
  "org.apache.spark" %% "spark-mllib" % sparkVersion,
  "org.apache.spark" %% "spark-streaming" % sparkVersion,
  "org.apache.spark" %% "spark-hive" % sparkVersion
)

并收到一堆警告:

8/6/17
1:29 PM SBT project import
                [warn] Found version conflict(s) in library dependencies; some are suspected to be binary incompatible:
                [warn]  * io.netty:netty:3.9.9.Final is selected over {3.6.2.Final, 3.7.0.Final}
                [warn]      +- org.apache.spark:spark-core_2.11:2.2.0             (depends on 3.9.9.Final)
                [warn]      +- org.apache.zookeeper:zookeeper:3.4.6               (depends on 3.6.2.Final)
                [warn]      +- org.apache.hadoop:hadoop-hdfs:2.6.5                (depends on 3.6.2.Final)
                [warn]  * commons-net:commons-net:2.2 is selected over 3.1
                [warn]      +- org.apache.spark:spark-core_2.11:2.2.0             (depends on 2.2)
                [warn]      +- org.apache.hadoop:hadoop-common:2.6.5              (depends on 3.1)
                [warn]  * com.google.guava:guava:11.0.2 is selected over {12.0.1, 16.0.1}
                [warn]      +- org.apache.hadoop:hadoop-yarn-client:2.6.5         (depends on 11.0.2)
                [warn]      +- org.apache.hadoop:hadoop-yarn-api:2.6.5            (depends on 11.0.2)
                [warn]      +- org.apache.hadoop:hadoop-yarn-common:2.6.5 

我有几个可能很愚蠢的问题:

  1. 有没有更好的方法来构建 build.sbt(添加其他解析器,例如?),这样我就可以摆脱警告?
  2. 我应该关心警告吗?

【问题讨论】:

    标签: scala apache-spark intellij-idea sbt


    【解决方案1】:

    有没有更好的方法来构建 build.sbt(添加其他解析器,例如?),这样我就可以摆脱警告?

    一种方法是根据您的情况手动告诉 sbt 您喜欢哪些依赖项:

    dependencyOverrides ++= Set(
      "io.netty" % "netty" % "3.9.9.Final",
      "commons-net" % "commons-net" % "2.2",
      "com.google.guava" % "guava" % "11.0.2"
    )
    

    我也推荐阅读conflict management in sbt

    我应该关心警告吗?

    在您的情况下 - 不,因为您的冲突源于仅使用在同一版本下发布的与 spark 相关的工件。 Spark 是一个拥有庞大用户群的项目,并且由于传递依赖而引入 jar hell 的可能性相当低(尽管从技术上来说并不能保证)。

    一般情况下 - 也许。通常,在大多数情况下都可以,但存在需要仔细手动解决依赖关系的问题的可能性很小(如果可能的话)。在这些情况下,在您运行应用程序并遇到一些问题(例如缺少类、方法、方法签名不匹配或某些反射相关问题)之前,很难判断是否存在问题。

    【讨论】:

    • 好答案。每次我遇到这样的警告时,我都想知道为什么某些 lib 创建者以产生此类警告的方式声明 lib 依赖项。当我看到这个时,我在想“伙计们,你们有没有尝试在 SBT 中构建自己的项目?你们没有看到这些警告吗?” :)
    • @Eugene 感谢您的努力,但我构建的 SBT 仍然失败(请参阅更新日志)。有什么想法吗?
    • @SergeyBushmanov:使用"io.netty" % "netty" % "3.9.9.Final",然后在sbt 控制台中运行reloadupdate
    • @chunjef 谢谢,现在可以使用了!!! Eugene Loy,你能更新你的答案,我会接受吗???
    • @SergeyBushmanov 完成。对我来说这是不准确的,对此深表歉意。顺便说一句,我认为最好在您的开篇文章中删除与 netty 版本相关的编辑,以简化那些寻求原始问题答案的人的体验。我认为与版本控制相关的这个小问题与解决原始问题无关,只会增加不必要的细节。
    【解决方案2】:

    sbt 中,Spark 通常被列为Provided 依赖项,即,

    "org.apache.spark" %% "spark-core" % sparkVersion % Provided
    

    您可能会引入不必要且冲突的递归依赖项。

    【讨论】:

      【解决方案3】:

      如果一切正常,您可以通过将其添加到构建设置来禁用这些警告:

      evictionWarningOptions in update := EvictionWarningOptions.default
      .withWarnTransitiveEvictions(false)
      

      【讨论】:

        猜你喜欢
        • 2018-04-10
        • 2018-10-02
        • 2013-05-24
        • 2018-08-06
        • 1970-01-01
        • 2023-04-10
        • 2018-03-20
        • 2016-08-22
        • 1970-01-01
        相关资源
        最近更新 更多