作者:粉红的少女 | 来源:互联网 | 2023-05-22 14:02
我正在使用SBT(在IntelliJ IDEA中)构建一个简单的Scala项目.
我想知道构建Uber JAR文件(又名Fat JAR,Super JAR)的最简单方法是什么.
我目前正在使用SBT但是当我将我的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
它看起来是因为我的一些依赖项包括需要在最终的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的实验.
谢谢.
1> Yves M...:
最后,我完全跳过使用IntelliJ IDEA来避免在全球理解中产生噪音:)
我开始阅读官方的SBT教程.
我用以下文件结构创建了我的项目:
my-project/project/assembly.sbt
my-project/src/main/scala/myPackage/MyMainObject.scala
my-project/build.sbt
在我的assembly.sbt文件中添加了sbt-assembly 插件.允许我建立一个胖JAR:
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
我的minimal 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中包含依赖项(这些库已包含在我的worker中)
注意:受此答案启发的 META-INF丢弃.
注意:%
和的含义%%
现在我可以通过在my / my-project根文件夹中运行以下命令来使用SBT(如何安装它)来构建我的胖JAR :
sbt assembly
我的胖JAR现在位于新生成的/目标文件夹中:
/my-project/target/scala-2.11/my-project-assembly-1.0.jar
希望能帮助别人.
对于那些想在IntelliJ IDE中嵌入SBT的人:如何从IntelliJ IDEA中运行sbt-assembly任务?
@JimLohse正确的链接是https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/troubleshooting/missing_dependencies_in_jar_files.html
2> Ajay Gupta..:
在IntelliJ Idea中构建优步JAR/Fat JAR的3步流程:
Uber JAR/Fat JAR:JAR文件中包含所有外部libraray依赖项.
在IntelliJ Idea中添加SBT Assembly插件
转到ProjectName/project/target/plugins.sbt文件并添加此行addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
在build.sbt中添加合并,放弃和不添加策略
转到ProjectName/build.sbt文件并添加Uber JAR的打包策略
合并策略:如果两个包中存在关于库版本的冲突,那么要在Uber JAR中打包哪个.
丢弃策略:从库中删除一些您不想在Uber JAR中打包的文件.
不添加策略:不要向Uber JAR添加一些包.
例如:spark-core
将出现在您的Spark Cluster中.所以我们不应该在Uber JAR中打包它
合并策略和丢弃策略基本代码:
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}
因此,您要求使用此命令丢弃META-INF文件,如果使用此命令存在任何冲突,则使用第一次出现的库文件的MergeStrategy.discard
其余文件.MergeStrategy.first
不要添加策略基本代码:
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.4.1" %"provided"
如果我们不想将spark-core添加到我们的Uber JAR文件中,因为它已经存在于我们的clutser中,所以我们% "provided"
在它的库末尾添加了它.
构建具有所有依赖关系的Uber JAR
sbt assembly
用于构建包的终端类型
瞧!Uber JAR已建成.JAR将在ProjectName/target/scala-XX中
3> ARMV..:
将以下行添加到project/plugins.sbt中
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")
将以下内容添加到build.sbt中
mainClass in assembly := some("package.MainClass")
assemblyJarName := "desired_jar_name_after_assembly.jar"
val meta = """META.INF(.)*""".r
assemblyMergeStrategy in assembly := {
case PathList("javax", "servlet", xs @ _*) => MergeStrategy.first
case PathList(ps @ _*) if ps.last endsWith ".html" => MergeStrategy.first
case n if n.startsWith("reference.conf") => MergeStrategy.concat
case n if n.endsWith(".conf") => MergeStrategy.concat
case meta(_) => MergeStrategy.discard
case x => MergeStrategy.first
}
程序集合并策略用于解决创建胖jar时发生的冲突.
对于scala版本2.11.8(SBT版本:0.13.12),将addSbtPlugin(“ com.eed3si9n”%“ sbt-assembly”%“ 0.12.0”)放入project / assembly.sbt