使用sbt程序集创建胖jar时的scala.MatchError

时间:2016-03-15 17:05:40

标签: scala spray sbt-assembly

我正在尝试为我的项目创建一个jar文件。我正在使用sbt assembly命令生成一个。

但在开始合并文件时收到错误:

  

scala.MatchError:   喷\ HTTP \解析器\ ProtocolParameterRules $$ anonfun $ DeltaSeconds $ 1.class   (类java.lang.String)

我的build.sbt看起来像这样:

angular2-annotations

不知道为什么会出现错误。

1 个答案:

答案 0 :(得分:0)

设置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的文件合并到胖jar中,但找不到任何匹配的合并策略。您还需要一个“默认”案例:

(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)
}

sbt-assemblyassembly任务由于elasticsearch中的名称冲突及其传递的joda-time依赖项而无法创建胖jar时,我也遇到了同样的问题。 Elasticsearch重新定义了已经在joda-time库中实现的类org.joda.time.base.BaseDateTime。我已按照您的方法告诉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)
}