gpt4 book ai didi

scala - 如何在 IntelliJ IDEA 中使用 SBT 构建 Uber JAR(Fat JAR)?

转载 作者:行者123 更新时间:2023-12-03 05:06:46 25 4
gpt4 key购买 nike

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

我想知道构建 Uber JAR 文件(又名 Fat JAR、Super JAR)的最简单方法是什么。

我目前正在使用 SBT,但是当我将 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这是因为我的一些依赖项包含签名文件 (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 文件。但我最终遇到了同样的错误......

我是 SBT 新手,还没有尝试过 IntelliJ IDE。

谢谢。

最佳答案

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

我开始阅读 official SBT tutorial .

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

my-project/project/assembly.sbt
my-project/src/main/scala/myPackage/MyMainObject.scala
my-project/build.sbt

添加了 sbt-assembly plugin在我的 assembly.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")
)

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 中(这些库已包含在我的工作程序中)

注意:META-INF 丢弃 inspired by this answser .

注意: % 的含义和 %%

现在我可以通过在我的 /my-project 根文件夹中运行以下命令,使用 SBT ( how to install it ) 构建我的 fat JAR:

sbt assembly

我的 fat JAR 现在位于新生成的 /target 文件夹中:

/my-project/target/scala-2.11/my-project-assembly-1.0.jar
<小时/>

对于那些想要在 IntelliJ IDE 中嵌入 SBT 的人:How to run sbt-assembly tasks from within IntelliJ IDEA?

关于scala - 如何在 IntelliJ IDEA 中使用 SBT 构建 Uber JAR(Fat JAR)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28459333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com