J'utilise sbt 1.2.8 et sbt-assembly 0.14.9. J'essaie de créer un gros JAR pour mon projet qui utilise Spark + Akka + gRPC. J'ai eu de nombreuses erreurs de déduplication au début; J'ai réussi à résoudre tous les problèmes sauf 1, et je n'ai pas trouvé de moyen de résoudre celui-ci pendant des heures.
Voici le message d'erreur que je reçois de sbt assembly
:
import sbt.Keys._ import sbtassembly.AssemblyPlugin.autoImport.PathList name := "xxx" version := "1.0" lazy val sv = "2.11.12" scalaVersion := sv lazy val akkaVersion = "2.5.19" lazy val sparkVersion = "2.4.0" enablePlugins(AkkaGrpcPlugin) enablePlugins(JavaAgent) javaAgents += "org.mortbay.jetty.alpn" % "jetty-alpn-agent" % "2.0.9" % "runtime;test" test in assembly := {} logLevel in assembly := Level.Debug lazy val root = (project in file(".")). settings( inThisBuild(List( organization := "com.smddzcy", scalaVersion := sv )), name := "xxx", libraryDependencies ++= Seq( "org.apache.spark" %% "spark-core" % sparkVersion, "org.apache.spark" %% "spark-sql" % sparkVersion, "org.mariadb.jdbc" % "mariadb-java-client" % "2.3.0", "com.typesafe.akka" %% "akka-actor" % akkaVersion, "com.typesafe.akka" %% "akka-protobuf" % akkaVersion, "com.typesafe.akka" %% "akka-stream" % akkaVersion, // "com.google.guava" % "guava" % "27.0.1-jre" % Compile, // "org.apache.httpcomponents" % "httpcore" % "4.4.10" % Compile, "com.typesafe.akka" %% "akka-stream-testkit" % akkaVersion % Test, "org.scalatest" %% "scalatest" % "3.0.5" % Test ) ) assemblyMergeStrategy in assembly := { case PathList(pl@_*) if pl.contains("log4j.properties") => MergeStrategy.concat case PathList("META-INF", "io.netty.versions.properties") => MergeStrategy.last case PathList("org", "aopalliance", xs@_*) => MergeStrategy.first case PathList("javax", "inject", xs@_*) => MergeStrategy.first case PathList("javax", "servlet", xs@_*) => MergeStrategy.first case PathList("javax", "activation", xs@_*) => MergeStrategy.first case PathList("org", "commons-collections", x@_*) => MergeStrategy.first case PathList("org", "apache", xs@_*) => MergeStrategy.first case PathList("com", "google", xs@_*) => MergeStrategy.first case "about.html" => MergeStrategy.rename case "META-INF/ECLIPSEF.RSA" => MergeStrategy.first case "META-INF/mailcap" => MergeStrategy.first case "META-INF/mimetypes.default" => MergeStrategy.first case "plugin.properties" => MergeStrategy.first case "application.conf" => MergeStrategy.concat case "reference.conf" => MergeStrategy.concat case x => val oldStrategy = (assemblyMergeStrategy in assembly).value oldStrategy(x) }
Voici mon build.sbt
:
[error] (assembly) deduplicate: different file contents found in the following: [error] /Users/samedduzcay/.ivy2/cache/org.apache.arrow/arrow-vector/jars/arrow-vector-0.10.0.jar:git.properties [error] /Users/samedduzcay/.ivy2/cache/org.apache.arrow/arrow-format/jars/arrow-format-0.10.0.jar:git.properties [error] /Users/samedduzcay/.ivy2/cache/org.apache.arrow/arrow-memory/jars/arrow-memory-0.10.0.jar:git.properties
Il me manque probablement quelque chose dans assemblyMergeStrategy
( ou avoir quelque chose en plus).
3 Réponses :
Dans mon cas, j'ai utilisé le code suivant dans build.sbt , qui prend conditionnellement le premier fichier s'il y a des doublons lors de la construction -
assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }
Si vous faites cela, vous perdez certains des fichiers de configuration comme reference.conf
. J'obtiens une erreur comme celle-ci: reference.conf: 27: Impossible de résoudre la substitution à une valeur: $ {ssl-config}
Merci beaucoup! L'utilisation de cela comme base et l'ajout / la modification de certaines choses ont résolu le problème. Veuillez voir ma réponse pour le assemblyMergeStrategy
fonctionnel.
La mise à jour de assemblyMergeStrategy
a résolu le problème:
assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => xs map {_.toLowerCase} match { case "manifest.mf" :: Nil | "index.list" :: Nil | "dependencies" :: Nil => MergeStrategy.discard case ps @ x :: xs if ps.last.endsWith(".sf") || ps.last.endsWith(".dsa") => MergeStrategy.discard case "plexus" :: xs => MergeStrategy.discard case "services" :: xs => MergeStrategy.filterDistinctLines case "spring.schemas" :: Nil | "spring.handlers" :: Nil => MergeStrategy.filterDistinctLines case _ => MergeStrategy.first } case "application.conf" => MergeStrategy.concat case "reference.conf" => MergeStrategy.concat case _ => MergeStrategy.first }
Notez que case PathList ("META-INF", xs @ _ *) =>
partie provient de la stratégie de fusion par défaut de sbt-assembly
, je viens de changer le dernier bit case _ => MergeStrategy.deduplicate
en case _ = > MergeStrategy.first
.
Je pense que comme votre conflit est avec le fichier git.properties
, vous pouvez ajouter un cas pour ce fichier:
assemblyMergeStrategy in assembly := { // ... other directives case "application.conf" => MergeStrategy.concat case "log4j.properties" => MergeStrategy.first case "unwanted.txt" => MergeStrategy.discard // ... other directives case "git.properties" => MergeStrategy.first // or maybe: case "git.properties" => MergeStrategy.concat case x => val oldStrategy = (assemblyMergeStrategy in assembly).value oldStrategy(x) }
En tant que stratégie de fusion complète, la suivante:
case "git.properties" => MergeStrategy.first // or case "git.properties" => MergeStrategy.concat
Essayez-le et voyez s'il a résolu le problème
Merci pour la réponse, mais c'est déjà corrigé! Vérifiez ma réponse ci-dessous.