2016-04-08 26 views
1

Ich bin neu bei sbt/assembly. Ich versuche, einige Abhängigkeitsprobleme zu lösen, und es scheint, dass der einzige Weg dazu eine benutzerdefinierte Merge-Strategie ist. Jedes Mal, wenn ich versuche, eine Merge-Strategie hinzuzufügen bekomme ich eine scheinbar zufällige MatchError zum Kompilieren:assemblyMergeStrategy verursacht scala.MatchError beim Kompilieren

[error] (*:assembly) scala.MatchError: org/apache/spark/streaming/kafka/KafkaUtilsPythonHelper$$anonfun$13.class (of class java.lang.String) 

ich dieses Spiel Fehler für den kafka Bibliothek zeige, aber wenn ich ganz die Bibliothek nehmen, bekomme ich eine MatchError in einer anderen Bibliothek. Wenn ich alle Bibliotheken heraushole, bekomme ich einen MatchError auf meinen eigenen Code. Das passiert nicht, wenn ich den Block "assemblyMergeStrategy" herausnehme. Ich vermisse eindeutig etwas unglaublich Einfaches, aber für das Leben von mir kann ich es nicht finden und ich kann niemanden finden, der dieses Problem hat. Ich habe die ältere mergeStrategy-Syntax ausprobiert, aber soweit ich aus den Dokumenten und SO lesen kann, ist dies der richtige Weg, um es jetzt zu schreiben. Bitte helfen Sie?

Hier ist mein Projekt/assembly.sbt:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3") 

Und meine project.sbt Datei:

name := "Clerk" 

version := "1.0" 

scalaVersion := "2.11.6" 

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "1.6.1" % "provided", 
    "org.apache.spark" %% "spark-sql" % "1.6.1" % "provided", 
    "org.apache.spark" %% "spark-streaming" % "1.6.1" % "provided", 
    "org.apache.kafka" %% "kafka" % "0.8.2.1", 
    "ch.qos.logback" % "logback-classic" % "1.1.7", 
    "net.logstash.logback" % "logstash-logback-encoder" % "4.6", 
    "com.typesafe.scala-logging" %% "scala-logging" % "3.1.0", 
    "org.apache.spark" %% "spark-streaming-kafka" % "1.6.1", 
    ("org.apache.spark" %% "spark-streaming-kafka" % "1.6.1"). 
    exclude("org.spark-project.spark", "unused") 
) 

assemblyMergeStrategy in assembly := { 
    case PathList("org.slf4j", "impl", xs @ _*) => MergeStrategy.first 
} 

assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = false) 

Antwort

1

Sie für Ihren Merge-Strategie Mustervergleich einen Standardfall fehlen:

assemblyMergeStrategy in assembly := { 
    case PathList("org.slf4j", "impl", xs @ _*) => MergeStrategy.first 
    case x => 
    val oldStrategy = (assemblyMergeStrategy in assembly).value 
    oldStrategy(x) 
}