/ / assemblyMergeStrategy provoquant scala.MatchError lors de la compilation - scala, sbt, sbt-assembly

assemblyMergeStrategy provoquant scala.MatchError lors de la compilation - scala, sbt, sbt-assembly

Je suis nouveau pour sbt / assembly. J'essaie de résoudre certains problèmes de dépendance, et il semble que la seule façon de le faire consiste à utiliser une stratégie de fusion personnalisée. Cependant, chaque fois que j'essaie d'ajouter une stratégie de fusion, la méthode de compilation que je viens de créer est aléatoire:

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

Je montre cette erreur de correspondance pour le kafkabibliothèque, mais si je sors complètement de cette bibliothèque, j’obtiens MatchError sur une autre bibliothèque. Si je retire toutes les bibliothèques, j'obtiens un MatchError sur mon propre code. Rien de tout cela ne se produit si je supprime le bloc "assemblyMergeStrategy". Il me manque clairement quelque chose d’incroyablement fondamental, mais je ne peux pas le trouver et je ne peux pas trouver quelqu'un qui a ce problème. J’ai essayé l’ancienne syntaxe mergeStrategy, mais dans la mesure où je peux le lire. de la documentation et SO, c'est la bonne façon de l'écrire maintenant. S'il vous plaît aider?

Voici mon projet / assembly.sbt:

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

Et mon fichier project.sbt:

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)

Réponses:

2 pour la réponse № 1

Il manque un cas par défaut pour votre correspondance de modèle de stratégie de fusion:

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