2015-08-13 37 views
1

我正在構建一個應用程序並試圖通過sbt程序包將它打包爲一個胖jar,但是我的類沒有被包含在最終的jar文件中。它包含兩個我創建的附加jar文件作爲依賴關係。我的代碼看起來是這樣的:SBT:沒有包含在jar文件中的類

package com.my.new.pacakge 

import com.my.package.num1 
import com.my.package.num2 

object myNewObject { ....} 

我的build文件看起來像這樣:

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") 
) 

當我運行的彙編,罐子pacakges就好了,但如果我跑「罐子TF」看什麼在jar中,沒有任何與com.my.new.package相關的東西在那裏。其他一切似乎都在那裏。

我的其他jar和這個新對象之間存在一些共同的依賴關係,這些對象會產生一些衝突,因此會導致合併策略。我懷疑合併策略中的某些內容會導致myNewObject被彈出,但我不確定爲什麼。如果任何人都可以指出我在做什麼錯誤,不勝感激。

回答

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) 
} 
+0

不幸的是,當我使用上述內容時,它不再解決很多事情的衝突。他們似乎都是包含在我的.ivy2目錄中的項目。我試圖添加一個案例,說「case PathList(」。ivy2「,xs @ _ *)=> MergeStrategy.concat」,但我不知道我寫的是否正確,因爲它仍然沒有解決衝突。 –