我正试图为我的项目创建一个jar文件。我使用sbt程序集命令生成一个程序集。
但是当它开始合并文件时出错:
spray\http\parser\ProtocolParameterRules$$anonfun$DeltaSeconds$1.class :scala.MatchError(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
}不知道为什么会出现错误。
发布于 2016-04-11 16:02:45
设置assemblyMergeStrategy in assembly的类型为String => MergeStrategy。
在sbt文件中,您使用的是部分函数。
{
case "BaseDateTime.class" => MergeStrategy.first
}这是语法糖
(s:String) => {
s match {
case "BaseDateTime.class" => MergeStrategy.first
}
}这种表示形式表明,给定函数将不完全匹配所有传递的字符串。在您的示例中,sbt程序集试图将名为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任务由于elasticsearch中的名称冲突及其传递的joda-time依赖项而未能创建胖jar时,我也遇到了同样的问题。Elasticsearch重新定义了类org.joda.time.base.BaseDateTime,该类已经在joda-time库中实现。
assemblyMergeStrategy in assembly := {
case "org/joda/time/base/BaseDateTime.class" => MergeStrategy.first
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}https://stackoverflow.com/questions/36017697
复制相似问题