2015-02-11 169 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