SBT:类不包含在jar文件中

时间:2015-08-13 13:56:26

标签: scala jar sbt

我正在构建一个应用程序并尝试通过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被弹出但我不确定为什么。如果有人能指出我做错了什么,我们非常感激。

1 个答案:

答案 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)
}