热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在IntelliJIDEA中使用SBT构建UberJAR(FatJAR)?

如何解决《如何在IntelliJIDEA中使用SBT构建UberJAR(FatJAR)?》经验,为你挑选了3个好方法。

我正在使用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插件

    插件sbt路径

    转到ProjectName/project/target/plugins.sbt文件并添加此行addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.12.0")

    在build.sbt中添加合并,放弃和不添加策略

    建立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

    sbtassembly

    sbt assembly用于构建包的终端类型


瞧!Uber JAR已建成.JAR将在ProjectName/target/scala-XX中

JarBuilt



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
推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • php缓存ri,浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
    thinkPHP的F方法只能用于缓存简单数据类型,不支持有效期和缓存对象。S()缓存方法支持有效期,又称动态缓存方法。本文是小编日常整理有关thinkp ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
author-avatar
粉红的少女
网络借贷平台http://www.kljie.com/
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有