Search code examples
scalasbtscalatra

How to get sbt-assembly merge right?


In our Scala/Scalatra project, we have this merge policy for the plugin sbt-assembly:

assemblyMergeStrategy in assembly := {
  case x =>
   val oldStrategy = (assemblyMergeStrategy in assembly).value
   oldStrategy(x)
}

[error] 11 errors were encountered during merge java.lang.RuntimeException: deduplicate: different file contents found in the following: ~/.ivy2/cache/org.scalatra/scalatra_2.11/jars/scalatra_2.11-2.3.1.jar:mime.types ~/.ivy2/cache/com.amazonaws/aws-java-sdk-s3/jars/aws-java-sdk-s3-1.10.1.jar:mime.types

deduplicate: different file contents found in the following:
~/.ivy2/cache/commons-beanutils/commons-beanutils/jars/commons-beanutils-1.8.3.jar:org/apache/commons/collections/ArrayStack.class
~/.ivy2/cache/commons-collections/commons-collections/jars/commons-collections-3.2.1.jar:org/apache/commons/collections/ArrayStack.class
deduplicate: different file contents found in the following:

and the same error for different class names

What would be the right merge logic here?

Versions:

Scala : 2.11.7
SBT : 0.13.9
sbt-assembly: 0.13.0


Solution

  • My original issue was solved with:

    assemblyMergeStrategy in assembly := {
      case PathList("org", "apache", "commons", "collections", xs @ _*) =>
          MergeStrategy.last
      case PathList("mime.types") =>
          MergeStrategy.last
      case x =>
          val oldStrategy = (assemblyMergeStrategy in assembly).value
          oldStrategy(x)
    }