asamblea de fusión de-estrategia de problemas mediante sbt-asamblea

Estoy tratando de convertir un scala proyecto en un despliegue de grasa vaso con sbt-asamblea. Cuando ejecuto una asamblea tarea en sbt recibo el siguiente error:

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

Ahora desde el sbt-la documentación de la asamblea:

Si hay varios archivos comparten la misma ruta de acceso relativa (por ejemplo, un recurso denominado
aplicación.conf en dependencia varios Frascos), el valor predeterminado de la estrategia es
para comprobar que todos los candidatos tienen el mismo contenido y el error
de lo contrario. Este comportamiento puede ser configurado por la ruta de la base de
uno de los siguientes incorporado en las estrategias de escritura o uno personalizado:

  • MergeStrategy.deduplicate es el defecto descrito anteriormente
  • MergeStrategy.first recoge el primero de los archivos coincidentes en el classpath de la orden
  • MergeStrategy.last recoge el último
  • MergeStrategy.singleOrError se librara con un mensaje de error en conflicto
  • MergeStrategy.concat simplemente concatena todos los archivos coincidentes, e incluye el resultado
  • MergeStrategy.filterDistinctLines también concatena, pero deja fuera los duplicados a lo largo del camino
  • MergeStrategy.rename cambia el nombre de los archivos procedentes de los archivos jar
  • MergeStrategy.discard simplemente descarta archivos coincidentes

Pasando por esto puedo configurar mi generación.sbt de la siguiente manera:

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

En la última línea de la construcción.sbt, tengo:

mergeStrategy in assembly := mergeStrategy.first

Ahora, cuando yo ejecute SBT, me sale el siguiente error:

error: value first is not a member of sbt.SettingKey[String => sbtassembly.Plugin.MergeStrategy]
    mergeStrategy in assembly := mergeStrategy.first

Puede alguien señalar lo que yo podría estar haciendo mal aquí?

Gracias

InformationsquelleAutor sc_ray | 2013-02-09

7 Kommentare

  1. 7

    Creo que debería ser MergeStrategy.first con un capital M, así mergeStrategy in assembly := MergeStrategy.first.

    • Golpeando mi cabeza. Que fue un descuido. Gracias por señalándolo.
    • no me funciona, dice: construir.sbt:27: error: no se encuentra: valor mergeStrategy mergeStrategy en la asamblea := MergeStrategy.primero ^ [error] error de Tipo en la expresión
    • no, básicamente tenía que copiar todo el código y cambiar la forma de la mergeStrategy resuelve colisiones mediante la aceptación de la primera versión en lugar de un error de salida (aka lo maven hace): gist.github.com/stantonk/5303b7ec84b782a58628 no sé por qué sbt no hacerlo…
    • Esto no es correcto. de acuerdo a la documentación. Usted no puede hacer mergeStrategy in assembly := MergeStrategy.first porque mergeStrategy in assembly espera de una función y obtendrás un type mismatch error
  2. 13

    Como para la versión actual 0.11.2 (2014-03-25), la forma de definir la combinación de la estrategia es diferente.

    Esto está documentado aquí, la parte relevante es:

    NOTA:
    mergeStrategy en la asamblea espera de una función, no se puede hacer

    mergeStrategy in assembly := MergeStrategy.first

    La nueva forma es (copiado de la misma fuente):

    mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) =>
      {
        case PathList("javax", "servlet", xs @ _*)         => MergeStrategy.first
        case PathList(ps @ _*) if ps.last endsWith ".html" => MergeStrategy.first
        case "application.conf" => MergeStrategy.concat
        case "unwanted.txt"     => MergeStrategy.discard
        case x => old(x)
      }
    }

    Este es posiblemente aplicable a versiones anteriores así, no sé exactamente cuándo se ha cambiado.

    • El último ejemplo (que es la oficial) no funciona en la scala 10, mostrando el Tipo de desajuste
    • He probado el fragmento de código en un assembly.sbt, y funciona (Scala 2.10.3, sbt 0.13.2).
  3. 8

    Acabo de configurar un poco sbt proyecto que necesita renovar algunos mergeStrategies, y encontró la respuesta un poco anticuado, permítanme añadir mi código de trabajo para las versiones (como la de 4-7-2015)

    • sbt 0.13.8
    • scala 2.11.6
    • asamblea 0.13.0

      mergeStrategy in assembly := {
        case x if x.startsWith("META-INF") => MergeStrategy.discard //Bumf
        case x if x.endsWith(".html") => MergeStrategy.discard //More bumf
        case x if x.contains("slf4j-api") => MergeStrategy.last
        case x if x.contains("org/cyberneko/html") => MergeStrategy.first
        case PathList("com", "esotericsoftware", xs@_ *) => MergeStrategy.last //For Log$Logger.class
        case x =>
           val oldStrategy = (mergeStrategy in assembly).value
           oldStrategy(x)
      }
    • mergeStrategy es obsoleto ahora, el uso de assemblyMergeStrategy lugar.
  4. 4

    Para el nuevo sbt versión (sbt-versión :0.13.11), yo estaba recibiendo el error de slf4j; por el tiempo que se tomó el camino más fácil : por Favor, consulte también la respuesta aquí Scala SBT Asamblea no puede combinar debido a la de-duplicación de error en StaticLoggerBinder.class donde sbt-dependencia-gráfico herramienta se menciona que es muy bueno para hacer esto manualmente

    assemblyMergeStrategy in assembly <<= (assemblyMergeStrategy in assembly) {
      (old) => {
        case PathList("META-INF", xs @ _*) => MergeStrategy.discard
        case x => MergeStrategy.first
      }
    }
  5. 2

    esta es la forma correcta de combinar la mayoría de los comunes de java/scala proyectos.
    se encarga de META-INF y clases.

    también el servicio de inscripción en el META-INF es tomado cuidado de.

    assemblyMergeStrategy in assembly := {
    case x if Assembly.isConfigFile(x) =>
      MergeStrategy.concat
    case PathList(ps @ _*) if Assembly.isReadme(ps.last) || Assembly.isLicenseFile(ps.last) =>
      MergeStrategy.rename
    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 _ => MergeStrategy.first}
  6. 0

    Rápida actualización: mergeStrategy está en desuso. Uso assemblyMergeStrategy. Aparte de eso, las respuestas anteriores son todavía sólido

  7. 0

    Añadir lo siguiente a construir.sbt para agregar kafka como origen o destino

     assemblyMergeStrategy in assembly := {
     case PathList("META-INF", xs @ _*) => MergeStrategy.discard
     //To add Kafka as source
     case "META-INF/services/org.apache.spark.sql.sources.DataSourceRegister" => 
     MergeStrategy.concat
     case x => MergeStrategy.first
     }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea