assemblée-fusionner-des questions de stratégie à l'aide de sbt-assemblée
Je suis en train de convertir un projet scala dans un déploiement de graisse pot à l'aide de sbt-assemblée. Quand je lance mon assemblée tâche dans sbt j'obtiens l'erreur suivante:
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
Maintenant à partir de la sbt-documentation de l'assemblée:
Si plusieurs fichiers à partager le même chemin relatif (par exemple, une ressource nommée
application.conf dans de multiples dépendance des Pots), la stratégie par défaut est
pour vérifier que tous les candidats ont le même contenu et la sortie d'erreur
sinon. Ce comportement peut être configurée sur chaque chemin d'accès de base à l'aide de
soit l'une des opérations suivantes intégré dans les stratégies ou de l'écriture d'un programme personnalisé:
MergeStrategy.deduplicate
est la valeur par défaut décrites ci-dessusMergeStrategy.first
prend le premier de l'appariement des fichiers dans le classpath de l'ordreMergeStrategy.last
choisit le dernierMergeStrategy.singleOrError
écope avec un message d'erreur sur les conflitsMergeStrategy.concat
simplement concatène tous les fichiers correspondants et comprend le résultatMergeStrategy.filterDistinctLines
aussi concatène, mais laisse les doublons, le long de la voieMergeStrategy.rename
renomme les fichiers provenant de fichiers jarMergeStrategy.discard
supprime simplement les fichiers correspondants
D'aller par ce que je peux configurer mon build.sbt comme suit:
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
Dans la dernière ligne de la construction.sbt, j'ai:
mergeStrategy in assembly := mergeStrategy.first
Maintenant, quand je lance SBT, j'obtiens l'erreur suivante:
error: value first is not a member of sbt.SettingKey[String => sbtassembly.Plugin.MergeStrategy]
mergeStrategy in assembly := mergeStrategy.first
Quelqu'un peut-il point de ce que je pourrais faire de mal ici?
Grâce
Vous devez vous connecter pour publier un commentaire.
Je pense qu'il devrait être
MergeStrategy.first
avec un capitalM
, doncmergeStrategy in assembly := MergeStrategy.first
.mergeStrategy in assembly := MergeStrategy.first
parce quemergeStrategy in assembly
s'attend à une fonction et vous obtiendrez untype mismatch error
Comme pour la version actuelle 0.11.2 (2014-03-25), la manière de définir la stratégie de fusion est différente.
Cela est documenté ici, la partie pertinente est:
De la nouvelle façon de (copié à partir de la même source):
C'est peut-être applicable aux versions antérieures, je ne sais pas exactement quand il a changé.
assembly.sbt
, et il fonctionne (Scala 2.10.3, sbt 0.13.2).Je viens d'installation un peu sbt projet qui a besoin de refaire l'installation de certains mergeStrategies, et trouvé la réponse un peu désuet, permettez-moi d'ajouter mon code de travail pour les versions (comme de 4-7-2015)
assemblée 0.13.0
mergeStrategy
est obsolète maintenant, utilisezassemblyMergeStrategy
à la place.Pour la nouvelle sbt version (sbt-version :0.13.11), j'obtenais l'erreur de slf4j; pour le moment, a pris le chemin le plus facile : vous pouvez également consulter la réponse ici Scala SBT Assemblée ne peut pas fusionner en raison de la duplication d'erreur dans StaticLoggerBinder.class où sbt-dépendance-graph outil est mentionné ce qui est plutôt cool de le faire manuellement
ce est la bonne façon de fusionner la plupart des communes java/scala projets.
il prend soin de META-INF et les classes.
également l'enregistrement de service dans META-INF est pris en charge.
Mise à jour rapide: mergeStrategy est obsolète. Utilisation assemblyMergeStrategy. En dehors de cela, réponses précédentes sont toujours solide