【问题标题】:Verify shading in sbt-assembly IntelliJ验证 sbt-assembly IntelliJ 中的着色
【发布时间】:2018-05-05 18:33:08
【问题描述】:

我正在尝试将 GeoIP2 v2.10.0 Java API (https://github.com/maxmind/GeoIP2-java) 与 Apache Spark v2.2.0、Scala 2.11.8 一起使用。问题是,Apache Spark 在它的 pom 文件中有 jackson-databind artifact v2.6.5,因为 GeoIP2 需要最低版本的 jackson-databind 2.9.2。因此,我正在尝试使用sbt-assembly 遮蔽关联的库。我在 AWS-EMR 上使用 spark-submit 命令,但我不断收到以下依赖错误:

 Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.node.ArrayNode.<init>(Lcom/fasterxml/jackson/databind/node/JsonNodeFactory;Ljava/util/List;)V at com.maxmind.db.Decoder.decodeArray(Decoder.java:272)

出现上述异常主要是因为 jackson-databind v2.6.5 是从 Spark 中提取的,而不是使用 2.9.2。谁能告诉我我是否正确地进行了着色过程或者我是否遗漏了任何东西?如何验证 com.fasterxml.jackson.core.* 在 IntelliJ 中是否实际上被着色为 shaded.jackson.core.*?我尝试使用sbt-dependencyTree 插件,但只显示了com.fasterxml.jackson.core.* 的依赖关系。

以下是我的build.sbt文件:

    name := "Sessionization"
    version := "0.1"
    scalaVersion := "2.11.8"

    assemblyShadeRules in assembly := Seq(ShadeRule.rename("com.fasterxml.jackson.core.**" -> "shaded.jackson.core.@1").inAll
      //.inLibrary("com.fasterxml.jackson.core" % "jackson-databind" % "2.9.2")
      //.inLibrary("com.fasterxml.jackson.core" % "jackson-core" % "2.9.2")
      //.inLibrary("com.fasterxml.jackson.core" % "jackson-annotations" % "2.9.0")
      //.inProject
)

    // Have to use "provided" because of some deduplicate error in merging many same-name class files.
    libraryDependencies ++= Seq("com.maxmind.geoip2" % "geoip2" % "2.10.0", //"org.apache.spark" %% "spark-core" % "2.2.0" % "provided",
  "org.apache.spark" %% "spark-sql" % "2.2.0" % "provided"
  //"org.apache.spark" %% "spark-core" % "2.2.0" excludeAll( ExclusionRule(organization="com.fasterxml.jackson.core")),
  //"org.apache.spark" %% "spark-sql" % "2.2.0" excludeAll( ExclusionRule(organization="com.fasterxml.jackson.core"))
    )

提前致谢!

【问题讨论】:

    标签: scala intellij-idea sbt sbt-assembly


    【解决方案1】:

    说实话,我从未使用过装配阴影规则,但您是否尝试过以下任何一种方法:

    1. 取消注释您的排除规则尝试并将排除规则替换为ExclusionRule(organization = "*", name = "jackson-core")
    2. 在 build.sbt 的底部添加一个合并策略。大致如下:

      assemblyMergeStrategy in assembly := { case x if x.contains("decodeArray") => MergeStrategy.deduplicate case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }

    如果您仍然遇到问题,那么另一件有用的事情是将conflictManager := ConflictManager.strict 添加到您的 build.sbt 以识别冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-24
      • 2014-09-26
      • 2020-05-17
      • 2016-06-07
      • 2018-12-11
      • 2012-01-18
      • 2012-06-14
      • 2013-08-21
      相关资源
      最近更新 更多