2017-08-31 1 views
9

Ich benutze sbt Versammlung, um ein fettes Glas zu schaffen, das auf Funken laufen kann. Abhängigkeiten von grpc-netty. Guava Version auf Funke ist älter als die von grpc-netty erforderlich, und ich lief in diesen Fehler: java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument. Ich konnte dies lösen, indem ich userClassPathFirst auf "spark" auf "true" setzte, aber zu anderen Fehlern führte.sbt Versammlung Schattierung, um Fettglas zu schaffen, um auf Funken zu laufen

Korrigieren Sie mich, wenn ich falsch liege, aber von dem, was ich verstehe, sollte ich UserClassPathFirst nicht auf True setzen müssen, wenn ich Schattierung richtig mache. Hier ist, wie ich jetzt schattiere:

assemblyShadeRules in assembly := Seq(
    ShadeRule.rename("com.google.guava.**" -> "[email protected]") 
    .inLibrary("com.google.guava" % "guava" % "20.0") 
    .inLibrary("io.grpc" % "grpc-netty" % "1.1.2") 
) 

libraryDependencies ++= Seq(
    "org.scalaj" %% "scalaj-http" % "2.3.0", 
    "org.json4s" %% "json4s-native" % "3.2.11", 
    "org.json4s" %% "json4s-jackson" % "3.2.11", 
    "org.apache.spark" %% "spark-core" % "2.2.0" % "provided", 
    "org.apache.spark" % "spark-sql_2.11" % "2.2.0" % "provided", 
    "org.clapper" %% "argot" % "1.0.3", 
    "com.typesafe" % "config" % "1.3.1", 
    "com.databricks" %% "spark-csv" % "1.5.0", 
    "org.apache.spark" % "spark-mllib_2.11" % "2.2.0" % "provided", 
    "io.grpc" % "grpc-netty" % "1.1.2", 
    "com.google.guava" % "guava" % "20.0" 
) 

Was mache ich hier falsch und wie repariere ich es?

Antwort

3

Sie sind fast da. Was shadeRule tut, ist es renames class names, nicht Bibliotheksnamen:

The main ShadeRule.rename rule is used to rename classes. All references to the renamed classes will also be updated.

In der Tat, in com.google.guava:guava gibt es keine Klassen mit Paket com.google.guava:

$ jar tf ~/Downloads/guava-20.0.jar | sed -e 's:/[^/]*$::' | sort | uniq 
META-INF 
META-INF/maven 
META-INF/maven/com.google.guava 
META-INF/maven/com.google.guava/guava 
com 
com/google 
com/google/common 
com/google/common/annotations 
com/google/common/base 
com/google/common/base/internal 
com/google/common/cache 
com/google/common/collect 
com/google/common/escape 
com/google/common/eventbus 
com/google/common/graph 
com/google/common/hash 
com/google/common/html 
com/google/common/io 
com/google/common/math 
com/google/common/net 
com/google/common/primitives 
com/google/common/reflect 
com/google/common/util 
com/google/common/util/concurrent 
com/google/common/xml 
com/google/thirdparty 
com/google/thirdparty/publicsuffix 

Es sollte ausreichen, um Ihre Beschattung Regel, dies zu ändern:

assemblyShadeRules in assembly := Seq(
    ShadeRule.rename("com.google.common.**" -> -> "[email protected]") 
    .inLibrary("com.google.guava" % "guava" % "20.0") 
    .inLibrary("io.grpc" % "grpc-netty" % "1.1.2") 
) 

So brauchen Sie nicht userClassPathFirst zu ändern.

Darüber hinaus können Sie Ihre Beschattung Regel wie diese vereinfachen:

assemblyShadeRules in assembly := Seq(
    ShadeRule.rename("com.google.common.**" -> -> "[email protected]").inAll 
) 

Da org.apache.spark Abhängigkeiten provided, werden sie nicht in Ihrem Glas enthalten sein und nicht schattiert werden (daher wird Funke seine eigene unshaded Version verwenden von Guave, die es auf dem Cluster hat).

+0

Danke Nikolay. Ihre Lösung hat wie ein Zauber funktioniert! –

+0

@Kumar Bharath Prabhu Froh, dass es geholfen hat! –

Verwandte Themen