2017-11-22 16 views
1

GeoIP2 v2.10.0 Java API(https://github.com/maxmind/GeoIP2-java)をApache Spark v2.2.0、Scala 2.11.8で使用しようとしています。問題は、Apache Sparkにjackson-databindアーチファクトv2.6.5があり、GeomIP2にはjackson-databind 2.9.2の最小バージョンが必要なpomファイルがあります。したがって、私はsbt-assemblyを使って関連ライブラリを陰影にしようとしています。私は、AWS-EMRに​​コマンドを使用していますが、私は、次の依存関係のエラーを取得しておいてください。sbt-assembly IntelliJでシェーディングを確認

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) 

ジャクソンのDataBind v2.6.5がスパークからプルではなく、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.**" -> "[email protected]").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")) 
    ) 

ありがとう!

答えて

0

私は正直言ってよ、私は、アセンブリシェードルールを使用したことがないが、あなたはこれらのいずれかの方法を試してみました:

  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 }

問題が解決されない場合は、次に行うには、別の有用な事は競合を識別するために、あなたのbuild.sbtにconflictManager := ConflictManager.strictを追加することです。

関連する問題