我正在尝试为我的项目创建一个jar文件。我正在使用sbt assembly命令生成一个。
但在开始合并文件时收到错误:
scala.MatchError: 喷\ HTTP \解析器\ ProtocolParameterRules $$ anonfun $ DeltaSeconds $ 1.class (类java.lang.String)
我的build.sbt看起来像这样:
angular2-annotations
不知道为什么会出现错误。
答案 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-assembly的assembly
任务由于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)
}