首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sbt程序集创建胖jar时的scala.MatchError

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

Stack Overflow用户
提问于 2016-03-15 17:05:40
回答 1查看 1.1K关注 0票数 0

我正试图为我的项目创建一个jar文件。我使用sbt程序集命令生成一个程序集。

但是当它开始合并文件时出错:

spray\http\parser\ProtocolParameterRules$$anonfun$DeltaSeconds$1.class :scala.MatchError(java.lang.String类)

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

代码语言:javascript
复制
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

}

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

EN

回答 1

Stack Overflow用户

发布于 2016-04-11 16:02:45

设置assemblyMergeStrategy in assembly的类型为String => MergeStrategy

在sbt文件中,您使用的是部分函数。

代码语言:javascript
复制
{
   case "BaseDateTime.class" => MergeStrategy.first
}

这是语法糖

代码语言:javascript
复制
(s:String) => {
  s match {
    case "BaseDateTime.class" => MergeStrategy.first
  }
}

这种表示形式表明,给定函数将不完全匹配所有传递的字符串。在您的示例中,sbt程序集试图将名为spray\http\parser\ProtocolParameterRules$$anonfun$DeltaSeconds$1.class的文件合并到胖jar中,但找不到任何匹配的合并策略。您还需要一个“默认”案例:

代码语言:javascript
复制
(s:String) => {
  s match {
    case "BaseDateTime.class" => MergeStrategy.first
    case x =>
      val oldStrategy = (assemblyMergeStrategy in assembly).value
      oldStrategy(x)
  }
}

或写成部分函数:

代码语言:javascript
复制
{
  case "BaseDateTime.class" => MergeStrategy.first
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}

sbt-装配assembly任务由于elasticsearch中的名称冲突及其传递的joda-time依赖项而未能创建胖jar时,我也遇到了同样的问题。Elasticsearch重新定义了类org.joda.time.base.BaseDateTime,该类已经在joda-time库中实现。

代码语言:javascript
复制
assemblyMergeStrategy in assembly := {
  case "org/joda/time/base/BaseDateTime.class" => MergeStrategy.first
  case x =>
    val oldStrategy = (assemblyMergeStrategy in assembly).value
    oldStrategy(x)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36017697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档