我正在使用SBT(在IntelliJ IDEA中)构建一个简单的Scala项目 .
我想知道构建 Uber JAR 文件(又名Fat JAR,Super JAR)的 simplest way 是什么 .
我'm currently using SBT but when I'我将我的JAR文件提交到Apache Spark我收到以下错误:
线程“main”中的异常java.lang.SecurityException:Manifest主要属性的签名文件摘要无效
或者在编译期间出现此错误:
java.lang.RuntimeException:deduplicate:在以下位置找到不同的文件内容: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的实验 .
谢谢 .
3 回答
最后,我完全跳过使用IntelliJ IDEA来避免在全球理解中产生噪音:)
我开始阅读official SBT tutorial .
我用以下文件结构创建了我的项目:
在我的 assembly.sbt 文件中添加了sbt-assembly plugin . 允许我 Build 一个胖JAR:
我的最小 build.sbt 看起来像:
注意:% "provided"表示不在最终的胖JAR中包含依赖项(这些库已包含在我的worker中)
注意:META-INF丢弃inspired by this answser .
注意:%和%%的含义
现在,我可以通过在 /my-project 根文件夹中运行以下命令,使用SBT(how to install it)构建我的胖JAR:
我的胖JAR现在位于新生成的 /target 文件夹中:
希望能帮助别人 .
对于那些想在IntelliJ IDE中嵌入SBT的人:How to run sbt-assembly tasks from within IntelliJ IDEA?
在IntelliJ Idea中构建Uber JAR / Fat JAR的3步流程:
Uber JAR/Fat JAR :JAR文件中包含所有外部libraray依赖项 .
转到 ProjectName/project/target/plugins.sbt 文件并添加此行
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
转到 ProjectName/build.sbt 文件并添加Uber JAR的包装策略
Merge Strategy : 如果关于某个版本的库的两个软件包存在冲突,那么要在Uber JAR中打包哪个软件包 .
Discard Strategy : 从库中删除一些您不想在Uber JAR中打包的文件 .
Do not Add Strategy : 不要向Uber JAR添加一些包 .
例如:
spark-core
将出现在您的Spark Cluster中 . 所以我们不应该在Uber JAR中打包它Merge Strategy and Discard Strategy Basic Code :
assemblyMergeStrategy in assembly := { case PathList("META-INF", xs @ _*) => MergeStrategy.discard case x => MergeStrategy.first }
因此,您要求使用此命令
MergeStrategy.discard
丢弃META-INF文件,如果使用此命令MergeStrategy.first
发生任何冲突,则首先出现库文件的其余文件 .Do not Add Strategy Basic Code :
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.1" %"provided"
如果我们不想将spark-core添加到我们的Uber JAR文件中,因为它已经在我们的clutser上,所以我们在它的库依赖项末尾添加了
% "provided"
.在终端类型
sbt assembly
中用于构建包瞧! Uber JAR已建成 . JAR将在 ProjectName/target/scala-XX
将以下行添加到项目/ plugins.sbt
将以下内容添加到build.sbt中
程序集合并策略用于解决创建胖jar时发生的冲突 .