Probleme mit der Assembly-Merge-Strategie bei Verwendung von sbt-assembly
Ich versuche, ein Scala-Projekt mithilfe von in ein entfaltbares Fettglas umzuwandelnsbt-assembly. Wenn ich meine Assembly-Task in sbt ausführe, wird die folgende Fehlermeldung angezeigt:
Merging 'org/apache/commons/logging/impl/SimpleLog.class' with strategy 'deduplicate'
:assembly: deduplicate: different file contents found in the following:
[error] /Users/home/.ivy2/cache/commons-logging/commons-logging/jars/commons-logging-1.1.1.jar:org/apache/commons/logging/impl/SimpleLog.class
[error] /Users/home/.ivy2/cache/org.slf4j/jcl-over-slf4j/jars/jcl-over-slf4j-1.6.4.jar:org/apache/commons/logging/impl/SimpleLog.class
Nun aus der sbt-Assembly Dokumentation:
Wenn sich mehrere Dateien den gleichen relativen Pfad teilen (z. B. eine Ressource mit dem Namen application.conf in JARs mit mehreren Abhängigkeiten), besteht die Standardstrategie darin, zu überprüfen, dass alle Kandidaten den gleichen Inhalt haben, und ansonsten Fehler zu vermeiden. Dieses Verhalten kann auf Pfadbasis mit einer der folgenden integrierten Strategien oder durch Schreiben einer benutzerdefinierten Strategie konfiguriert werden:
MergeStrategy.deduplicate
ist die oben beschriebene StandardeinstellungMergeStrategy.first
wählt die erste der übereinstimmenden Dateien in der Reihenfolge des Klassenpfads ausMergeStrategy.last
wählt den letzten ausMergeStrategy.singleOrError
rettet sich mit einer Fehlermeldung bei KonfliktenMergeStrategy.concat
Verkettet einfach alle übereinstimmenden Dateien und enthält das ErgebnisMergeStrategy.filterDistinctLines
verkettet auch, lässt aber Duplikate ausMergeStrategy.rename
Benennt die Dateien um, die aus JAR-Dateien stammenMergeStrategy.discard
verwirft einfach passende DateienDabei richte ich meine build.sbt wie folgt ein:
import sbt._
import Keys._
import sbtassembly.Plugin._
import AssemblyKeys._
name := "my-project"
version := "0.1"
scalaVersion := "2.9.2"
crossScalaVersions := Seq("2.9.1","2.9.2")
//assemblySettings
seq(assemblySettings: _*)
resolvers ++= Seq(
"Typesafe Releases Repository" at "http://repo.typesafe.com/typesafe/releases/",
"Typesafe Snapshots Repository" at "http://repo.typesafe.com/typesafe/snapshots/",
"Sonatype Repository" at "http://oss.sonatype.org/content/repositories/releases/"
)
libraryDependencies ++= Seq(
"org.scalatest" %% "scalatest" % "1.6.1" % "test",
"org.clapper" %% "grizzled-slf4j" % "0.6.10",
"org.scalaz" % "scalaz-core_2.9.2" % "7.0.0-M7",
"net.databinder.dispatch" %% "dispatch-core" % "0.9.5"
)
scalacOptions += "-deprecation"
mainClass in assembly := Some("com.my.main.class")
test in assembly := {}
mergeStrategy in assembly := mergeStrategy.first
In der letzten Zeile der build.sbt habe ich:
mergeStrategy in assembly := mergeStrategy.first
Wenn ich SBT ausführe, wird folgende Fehlermeldung angezeigt:
error: value first is not a member of sbt.SettingKey[String => sbtassembly.Plugin.MergeStrategy]
mergeStrategy in assembly := mergeStrategy.first
Kann jemand darauf hinweisen, was ich hier falsch mache?
Vielen Dank