当前位置: 首页 > 知识库问答 >
问题:

如何在IntelliJ idea中使用SBT构建一个Uber JAR(胖JAR)?

邵麒
2023-03-14

我正在使用SBT(在IntelliJ IDEA中)构建一个简单的Scala项目。

我想知道什么是最简单的方法来建立一个Uber JAR文件(又名胖JAR,超级JAR)。

我当前使用的是SBT,但当我将JAR文件提交到Apache Spark时,我得到以下错误:

线程“main”java.lang.SecurityException中的异常:清单主属性的签名文件摘要无效

或在编译期间出现此错误:

java.lang.RuntimeException:重复数据删除:在以下文件中发现不同的文件内容:
path\dependency.jar:meta-inf/dependencies
path\dependency.jar:meta-inf/manifest.mf

这看起来是因为我的一些依赖包括签名文件(META-INF),它需要在最终的Uber JAR文件中删除。

我试着这样使用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中,我得到一个JAR文件。但我却犯了同样的错误...

多谢了。

共有1个答案

雍骏俊
2023-03-14

最后,我完全跳过使用IntelliJ IDEA来避免在我的全局理解中产生噪音:)

我开始阅读正式的SBT教程。

我使用以下文件结构创建了我的项目:

my-project/project/assembly.sbt
my-project/src/main/scala/myPackage/MyMainObject.scala
my-project/build.sbt
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")        
  )

val sparkVersion = "1.2.0"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % sparkVersion % "provided",
  "org.apache.spark" %% "spark-streaming" % sparkVersion % "provided",
  "org.apache.spark" %% "spark-streaming-twitter" % sparkVersion
)

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

注意:%“provided”表示不将依赖项包含在最终的fat JAR中(那些库已经包含在我的workers中)

注:META-INF丢弃受到这个答案的启发。

现在,我可以通过在我的/my-project根文件夹中运行以下命令,使用SBT(如何安装它)构建我的fat JAR:

sbt assembly

我的fat JAR现在位于新的generated/Target文件夹中:

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

希望能帮到别人。

 类似资料:
  • 问题内容: 我是Gradle新手。我想构建一个uberjar(AKA fatjar),其中包括项目的所有传递依赖项。我需要在“ build.gradle”中添加哪些行? 这是我目前拥有的:(我是从几天前的某个地方复制的,但是不要从那里收集。) 问题答案: 您是否尝试过 gradle食谱中 的fatjar示例? 您正在寻找的是gradle 的影子插件

  • 我试图在NetBeans中建立一个胖罐子。当我点击clean时,它显示以下错误: C:\workspace\travel_agency\nbproject\build-impl.xml:63:源资源不存在:C:\workspace\travel_agency\dist\nblibraries.properties 然后单击错误,它会将我发送到build-imple.xml文件中的以下行:

  • 我正在用一个胖罐子塑造一个码头工人的形象。我使用插件构建jar,使用构建Docker映像。我对SBT不是很熟悉,我遇到了以下问题。 > 构建映像的步骤之一是复制胖罐子。由于assembly插件在中创建jar,因此我需要知道确切的和jar名称。程序集似乎有一个键,但我不确定如何访问它。我尝试了以下失败的方法。 帮助

  • 我需要为我的一个子项目构建一个jar,包括依赖项,以便它可以用作。 我有一个多模块的sbt项目,这个模块是最低级别的(也是纯Java)。 我可以(例如使用sbt-onejar、sbt-proGuard或sbt组件)覆盖最低级别模块的打包方式吗? 看起来这些工具真的被设计成发布后的步骤,但是我真的需要一个(替换或附加的)发布的人工制品来包含依赖项(但只适用于这一个模块)。 更新:发布sbt程序集是针

  • 每个人 我不知道是否已经有人问过这个问题,但我到处找,但找不到。我正在使用GitHub进行Intellij IDEA项目。我在工作中使用我的台式计算机来开发。完成后,我在Github上做了一个提交,它直接在我的帐户上。但是,有时我想在家里继续使用笔记本电脑,使用同一个项目并修改和提交它。由于不太了解Github与Intellij的集成,我知道我可以将现有项目下载到本地计算机上。但我的问题是,如何更

  • 我在图书馆工作,需要一些依赖。为了便于部署,我想创建一个包含所有内容的JAR文件,包括依赖项。 我已经尝试过sbt汇编——这是可行的,但由于法律原因,这可能是不可取的,因此我正在寻找一种解决方案,其中生成的JAR文件包含原始JAR文件,并且类路径条目包含在清单中。MF的设置使得客户端类可以将这个“嵌套JAR文件”添加到它们的类路径中。 这样的事情可能吗?sbt one jar几乎可以满足我的需求,