scala.MatchError при создании толстой банки с использованием сборки sbt

Я пытаюсь создать файл jar для своего проекта. Я использую команду сборки sbt для ее создания.

Но получая ошибку, когда он начинает объединять файлы:

scala.MatchError: spray\http\parser\ProtocolParameterRules$$anonfun$DeltaSeconds$1.class (из класса java.lang.String)

Мой build.sbt выглядит так:

lazy val commonSettings = Seq(
  name := "SampleSpray",
  version := "1.0",
  scalaVersion := "2.11.7",
  organization := "com.test"

)
mainClass in assembly := Some("com.example.Boot")

lazy val root = (project in file(".")).
  settings(commonSettings: _*).
  settings(
    name := "test",
    resolvers += "spray repo" at "http://repo.spray.io",
    libraryDependencies ++= {
            val akkaV = "2.3.9"
            val sprayV = "1.3.3"
            Seq(
              "io.spray"            %%  "spray-can"     % sprayV,
              "io.spray"            %%  "spray-routing" % sprayV,
              "io.spray"            %%  "spray-json"    % "1.3.2",
              "io.spray"            %%  "spray-testkit" % sprayV  % "test",
              "com.typesafe.akka"   %%  "akka-actor"    % akkaV,
              "com.typesafe.akka"   %%  "akka-testkit"  % akkaV   % "test",
              "org.specs2"          %%  "specs2-core"   % "2.3.11" % "test",
              "com.sksamuel.elastic4s" %% "elastic4s-core" % "2.1.0",
              "com.sksamuel.elastic4s" %% "elastic4s-jackson" % "2.1.0",
              "net.liftweb" %% "lift-json" % "2.6+"
            )
  }
)


assemblyOption in assembly := (assemblyOption in assembly).value.copy(cacheUnzip = false)

assemblyMergeStrategy in assembly := {
  case "BaseDateTime.class"                            => MergeStrategy.first

}

Не знаю, почему ошибка приходит.


person abhishek    schedule 15.03.2016    source источник


Ответы (1)


Параметр assemblyMergeStrategy in assembly имеет тип String => MergeStrategy.

В вашем файле sbt вы используете частичную функцию

{
   case "BaseDateTime.class" => MergeStrategy.first
}

который является синтаксическим сахаром для

(s:String) => {
  s match {
    case "BaseDateTime.class" => MergeStrategy.first
  }
}

Это представление показывает, что данная функция не будет полностью соответствовать всем переданным строкам. В вашем случае sbt-assembly попытался объединить файл с именем spray\http\parser\ProtocolParameterRules$$anonfun$DeltaSeconds$1.class в толстую банку, но не смог найти подходящей стратегии слияния. Вам также нужен случай «по умолчанию»:

(s:String) => {
  s match {
    case "BaseDateTime.class" => MergeStrategy.first
    case x =>
      val oldStrategy = (assemblyMergeStrategy in assembly).value
      oldStrategy(x)
  }
}

Или записывается как частичная функция:

{
  case "BaseDateTime.class" => MergeStrategy.first
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}

Я также столкнулся с той же проблемой, когда задача assembly sbt-assembly не смогла создать толстую банку. из-за конфликта имен в elasticsearch и его транзитивных зависимостей joda-time. Elasticsearch переопределяет класс org.joda.time.base.BaseDateTime, который уже реализован в библиотеке joda-time. Я следовал вашему подходу, чтобы сообщить sbt-assembly, как разрешить этот конфликт, используя следующие assemblyMergeStrategy:

assemblyMergeStrategy in assembly := {
  case "org/joda/time/base/BaseDateTime.class" => MergeStrategy.first
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}
person Landlocked Surfer    schedule 11.04.2016