我正在构建一个应用程序并尝试通过sbt程序集将其打包为胖jar,但我的类没有被包含在最终的jar文件中。它包含了我创建的另外两个jar文件作为依赖项。我的代码看起来像这样:
package com.my.new.pacakge
import com.my.package.num1
import com.my.package.num2
object myNewObject { ....}
我的构建文件如下所示:
organization := "com.my.new.package"
name := "myProject"
spName := "com.my.new.package/myNewObject"
version := "0.2"
scalaVersion := "2.10.4"
sparkVersion := "1.3.0"
sparkComponents ++= Seq("streaming", "sql")
libraryDependencies += "com.databricks" %% "spark-avro" % "1.0.0"
libraryDependencies += "org.apache.avro" % "avro" % "1.7.7"
libraryDependencies += "org.apache.avro" % "avro-mapred" % "1.7.7"
libraryDependencies += "com.my.package" % "num1" % "0.1"
libraryDependencies += "com.my.package" % "num2" % "0.2"
mergeStrategy in assembly := {case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.concat}
lazy val sbtAssemblySettings = Seq(
assemblyJarName in assembly := {name.value + "-" + version.value + ".jar"},
mainClass in assembly := Some("com.my.new.package.myNewObject")
)
当我进行装配时,罐子就可以了,但是如果我跑了“罐子”的话。要查看jar中的内容,与com.my.new.package无关。其他一切似乎都存在。
我的其他jar和这个新对象之间存在一些共同的依赖关系,这会产生一些冲突,因此合并策略。我怀疑合并策略中的某些内容导致myNewObject被弹出但我不确定为什么。如果有人能指出我做错了什么,我们非常感激。
答案 0 :(得分:2)
case x => MergeStrategy.concat
我认为这意味着除META-INF
之外的所有文件都被卡在一起。您可能希望对与过滤器不匹配的任何内容使用默认策略。来自自述文件:
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
}