2015-02-11 167 views
63

我正在使用SBT(在IntelliJ IDEA中)構建一個簡單的Scala項目。如何在IntelliJ IDEA中使用SBT構建Uber JAR(Fat JAR)?

我想知道什麼是要建立一個尤伯杯JAR文件(又名脂肪JAR,超級JAR)的最簡單的方法

我目前使用SBT但是當我submiting我的JAR文件Apache Spark我得到以下錯誤:

Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

還是這個錯誤在編譯時:

java.lang.RuntimeException: deduplicate: different file contents found in the following:
PATH\DEPENDENCY.jar:META-INF/DEPENDENCIES
PATH\DEPENDENCY.jar:META-INF/MANIFEST.MF

looks like這是因爲我的一些依賴包括需要在最終的Uber JAR文件中刪除的簽名文件(META-INF)。

我試圖用sbt-assembly插件這樣的:

/project/assembly.sbt

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0") 

/project/plugins.sbt

logLevel := Level.Warn 

/build.sbt

lazy val commonSettings = Seq(
    name := "Spark-Test" 
    version := "1.0" 
    scalaVersion := "2.11.4" 
) 

lazy val app = (project in file("app")). 
    settings(commonSettings: _*). 
    settings(
    libraryDependencies ++= Seq(
     "org.apache.spark" %% "spark-core" % "1.2.0", 
     "org.apache.spark" %% "spark-streaming" % "1.2.0", 
     "org.apache.spark" % "spark-streaming-twitter_2.10" % "1.2.0" 
    ) 
) 

當我在IntelliJ IDEA中單擊「Build Artifact ...」時,我得到一個JAR文件。但我結束了相同的錯誤...

我是新來的SBT和沒有很好的實驗與IntelliJ IDE。

謝謝。

+2

通過的事情,你可能需要過濾掉'META-INF'文件的聲音 - 一個博客貼子,*力量*幫助:HTTPS: //janschulte.wordpress.com/2014/03/20/removing-meta-inf-directory-from-sbt-assembly/ – 2015-02-11 18:57:21

回答

106

最後我完全跳過使用IntelliJ IDEA的,以避免在全球我理解:)

我開始閱讀official SBT tutorial產生噪音。

我創建了具有以下文件結構的項目:

my-project/project/assembly.sbt 
my-project/src/main/scala/myPackage/MyMainObject.scala 
my-project/build.sbt 

添加了sbt-assemblypluginassembly.sbt文件。讓我建立一個胖JAR:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0") 

我最小build.sbt樣子:

lazy val root = (project in file(".")). 
    settings(
    name := "my-project", 
    version := "1.0", 
    scalaVersion := "2.11.4", 
    mainClass in Compile := Some("myPackage.MyMainObject")   
) 

libraryDependencies ++= Seq(
    "org.apache.spark" %% "spark-core" % "1.2.0" % "provided", 
    "org.apache.spark" %% "spark-streaming" % "1.2.0" % "provided", 
    "org.apache.spark" % "spark-streaming-twitter_2.10" % "1.2.0" 
) 

// META-INF discarding 
mergeStrategy in assembly <<= (mergeStrategy in assembly) { (old) => 
    { 
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard 
    case x => MergeStrategy.first 
    } 
} 

:本% "provided"指不包括在最後的脂肪JAR的依賴(這些庫已包含在我的工作人員中)

注意:META-INF丟棄inspired by this answser

sbt assembly 
:中 %%%

含義現在,我可以使用SBT(how to install it)在我的/我的項目根文件夾中運行以下命令來建立我的肥胖JAR

我的胖胖JAR現在位於新生成的/目標文件夾中:

/my-project/target/scala-2.11/my-project-assembly-1.0.jar 

希望能幫助別人。


對於那些誰想要的IntelliJ IDE中embeed SBT:How to run sbt-assembly tasks from within IntelliJ IDEA?

+1

Java/Maven關於[從Databricks https://排除Spark從超級罐問題的建議databricks.gitbooks.io/databricks-spark-knowledge-base/content/troubleshooting/missing_dependencies_in_jar_files.htm – JimLohse 2015-12-28 21:38:15

+3

@JimLohse正確的鏈接是https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/troubleshooting/missing_dependencies_in_jar_files .html – 2016-04-12 11:30:41

+0

@ZekeFast良好的感謝! – JimLohse 2016-04-12 20:13:52

11

以下行添加到您的項目/ plugins.sbt

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0") 

以下添加到您的build.sbt

裝配合並策略用於解決衝突o創建胖罐時發生。

+1

您可以通過在控制檯 – ARMV 2015-02-17 10:43:14

+1

中爲scala版本2.11.8(SBT版本:0.13.12)運行「sbt assembly」來創建脂肪Jar放置addSbtPlugin(「com.eed3si9n」%「sbt-assembly」%「0.12.0」)在項目/ assembly.sbt – ARMV 2016-10-27 13:21:45

31

3步驟的用於構造烏伯JAR /脂肪JAR中的IntelliJ理念:

烏伯JAR /脂肪JAR:具有在其所有外部libraray依賴性JAR文件。

  1. 添加在IntelliJ IDEA的

    Plugin sbt Path

    轉到項目名/項目/目標/ plugins.sbt文件SBT Assembly插件,並添加此行addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")

  2. 添加合併,拋棄和不添加策略build.sbt

    Build sbt Path

    轉到項目名/ build.sbt文件並添加策略的尤伯杯JAR的包裝

    合併策略:如果有衝突的兩個包約一個版本庫中的那麼哪一個包裝在Uber JAR中。
    放棄策略:從庫中刪除一些你不想在Uber JAR中打包的文件。
    不要添加策略:不要添加一些包到優步JAR。
    例如:spark-core已經存在於您的Spark羣集中。所以,我們不應該在尤伯杯的jar包這個

    合併策略和丟棄策略Basic代碼:

    assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }

    所以你問放棄META-INF文件中使用此命令MergeStrategy.discard和休息如果使用此命令MergeStrategy.first,如果存在任何衝突,您正在使用首次出現的文件的庫文件。

    不要添加策略Basic代碼:

    libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.1" %"provided"

    如果我們不想火花核添加到我們的尤伯杯JAR文件,因爲這將是已經在我們的clutser,所以我們在它的庫依賴關係的末尾添加% "provided"

  3. 大廈尤伯杯JAR與它的依賴性

    sbtassembly

    在終端類型sbt assembly建立了包


瞧!優步JAR建成。 JAR將在項目名/目標/斯卡拉-XX

JarBuilt