стратегия слияния не работает для решения проблемы дедупликации с sbt-assembly

Я получаю ошибки дедупликации при попытке запустить assembly. Я использовал несколько различных подходов к своей стратегии слияния, чтобы попытаться решить проблему, но ни один из них не работает.

вывод sbt для ошибки

[warn] Merging 'META-INF\DUMMY.DSA' with strategy 'discard'
[warn] Merging 'META-INF\DUMMY.SF' with strategy 'discard'
[warn] Merging 'META-INF\ECLIPSEF.SF' with strategy 'discard'
[warn] Merging 'META-INF\INDEX.LIST' with strategy 'discard'
[warn] Merging 'META-INF\MANIFEST.MF' with strategy 'discard'
[warn] Merging 'META-INF\services\java.sql.Driver' with strategy 'filterDistinctLines'
[warn] Merging 'META-INF\spring.handlers' with strategy 'filterDistinctLines'
[warn] Merging 'META-INF\spring.schemas' with strategy 'filterDistinctLines'
[debug] Merging 'META-INF\spring.tooling' with strategy 'deduplicate'
java.lang.RuntimeException: deduplicate: different file contents found in the following:
C:\Users\Matthew\.ivy2\cache\org.springframework\spring-jdbc\jars\spring-jdbc-4.0.5.RELEASE.jar:META-INF/spring.tooling
C:\Users\Matthew\.ivy2\cache\org.springframework\spring-beans\jars\spring-beans-4.0.5.RELEASE.jar:META-INF/spring.tooling
C:\Users\Matthew\.ivy2\cache\org.springframework\spring-tx\jars\spring-tx-4.0.5.RELEASE.jar:META-INF/spring.tooling

и построить.скала

import com.mojolly.scalate.ScalatePlugin.ScalateKeys._
import com.mojolly.scalate.ScalatePlugin._
import org.scalatra.sbt._
import sbt.Keys._
import sbt._
import sbtassembly.Plugin._
import sbtassembly.Plugin.AssemblyKeys._

object ScalatraBuild extends Build {
    val Organization = "com.my.myproject"
    val Name = "myproject"
    val Version = "0.1.0-SNAPSHOT"
    val ScalaVersion = "2.11.1"
    val ScalatraVersion = "2.3.0"
    val port = SettingKey[Int]("port")
    val Conf = config("container")

    lazy val project = Project(
        "myproject-platform",
        file("."),
        settings = Defaults.defaultConfigs ++ ScalatraPlugin.scalatraWithJRebel ++ net.virtualvoid.sbt.graph.Plugin.graphSettings ++ scalateSettings ++ assemblySettings ++ Seq(
            port in Conf := 8080,
            organization := Organization,
            name := Name,
            version := Version,
            scalaVersion := ScalaVersion,
            resolvers ++= Seq("Sonatype OSS Snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/",
                "RoundEights" at "http://maven.spikemark.net/roundeights",
                Resolver.sonatypeRepo("releases")),
            libraryDependencies ++= Seq(
                "org.scala-lang" % "scala-compiler" % "2.11.1",
                "org.scalatra" %% "scalatra" % ScalatraVersion,
                "org.scalatra" %% "scalatra-scalate" % ScalatraVersion,
                "org.scalatra" %% "scalatra-scalatest" % ScalatraVersion % "test",
                "org.scalatra" %% "scalatra-auth" % "2.3.0",
                "org.scalatra" %% "scalatra-json" % "2.3.0",
                "org.json4s" %% "json4s-jackson" % "3.2.10",
                "org.json4s" %% "json4s-ext" % "3.2.10",
                "org.json4s" %% "json4s-core" % "3.2.10",
                "com.chuusai" %% "shapeless" % "2.0.0",
                "com.github.julien-truffaut" %% "monocle-core" % "0.5.1",
                "com.github.julien-truffaut" %% "monocle-generic" % "0.5.1",
                "com.github.julien-truffaut" %% "monocle-macro" % "0.5.1",
                "com.roundeights" %% "mailgun-scala" % "0.2",
                "com.roundeights" %% "scalon" % "0.2",
                "net.databinder.dispatch" %% "dispatch-core" % "0.11.1",
                "com.escalatesoft.subcut" %% "subcut" % "2.1",
                "com.typesafe" % "config" % "1.2.1",
                "ch.qos.logback" % "logback-classic" % "1.0.13" % "runtime",
                "org.codehaus.janino" % "janino" % "2.6.1",
                "org.eclipse.jetty" % "jetty-webapp" % "8.1.8.v20121106" % "container;compile",
                "org.apache.derby" % "derby" % "10.10.1.1",
                "c3p0" % "c3p0" % "0.9.1.2",
                "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "compile;container;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar")),
                "com.googlecode.mapperdao" %% "mapperdao" % "1.0.1",
                "mysql" % "mysql-connector-java" % "5.1.18",
                "commons-dbcp" % "commons-dbcp" % "1.4",
                "com.stripe" % "stripe-java" % "1.18.0"
            ),
            mergeStrategy in assembly <<= (mergeStrategy in assembly) {
                (old) => {
                    case PathList(xs@_*) if xs.last endsWith ".tooling" => MergeStrategy.first
                    case PathList("META-INF", "spring.tooling") => MergeStrategy.first
                    case PathList("META-INF", xs @ _*) =>
                    (xs map {_.toLowerCase}) match {
                        case "spring.tooling" :: Nil => MergeStrategy.first
                    }
                    case x => old(x)
                }
            },
                scalateTemplateConfig in Compile <<=(sourceDirectory in Compile) { base =>
                Seq(
                    TemplateConfig(
                        base / "webapp" / "WEB-INF" / "templates",
                        Seq.empty, /* default imports should be added here */
                        Seq.empty, /* add extra bindings here */
                        Some("templates")
                    )
                )
            }
        )
    )
}

Как видите, я пробовал несколько разных вещей, но ни одна из них не подходит. Могу ли я получить некоторую помощь, пожалуйста?


person Matt Foxx Duncan    schedule 10.10.2014    source источник


Ответы (2)


Попробуй это

  case x if x.endsWith("spring.tooling") => MergeStrategy.last

Для меня файл сборки выглядит нормально, но вы можете попробовать добавить операторы «println», чтобы увидеть, используется ли на самом деле пользовательская стратегия слияния, возможно, sbt-assembly не видит ее.

person Eugene Zhulenev    schedule 11.10.2014
comment
Я добавил оператор println к своему совпадению case x, но он не сработал... Как вы думаете, поможет ли перенос настроек в их собственный assembly.sbt в корне проекта? В конце концов, это проект с одним модулем. - person Matt Foxx Duncan; 11.10.2014

Я использовал файл assembly.sbt в корне моего проекта, но указывал параметры стратегии слияния в build.scala. Как только я переместил настройки в этот файл, все заработало нормально.

person Matt Foxx Duncan    schedule 13.10.2014