1. ホーム
  2. scala

[解決済み] IntelliJ IDEAでSBTを使用してUber JAR (Fat JAR)をビルドする方法は?

2023-01-13 20:39:48

質問

SBT(intelliJ IDEA内)を使って、簡単なScalaプロジェクトをビルドしています。

私は、SBTがどのようなものであるかを知りたいと思います。 最も簡単な方法 を構築するための Uber JAR ファイル(別名Fat JAR、Super JAR)を構築します。

現在SBTを使用していますが、JARファイルを提出する際に Apache Spark というエラーが出ます。

スレッド "main" java.lang.SecurityException で例外が発生しました。無効な 署名ファイルのダイジェストが無効です。

または、コンパイル時にこのエラーが発生します。

java.lang.RuntimeException: deduplicate: 異なるファイルのコンテンツが見つかりました。 を以下に示します。

PATHDEPENDENCY.jar:META-INF/DEPENDENCIESにあります。

PATHDEPENDENCY.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"
    )
  )

"をクリックすると ビルドアーティファクト... をクリックすると、JAR ファイルが表示されます。しかし、私は同じエラーで終わる...

私はSBTに新しく、IntelliJ IDEであまり実験していません。

ありがとうございます。

どのように解決するのですか?

最終的に、私はグローバルな理解にノイズを発生させないために、IntelliJ IDEAを完全にスキップしています :)

を読み始めたのは SBT公式チュートリアル .

以下のようなファイル構成でプロジェクトを作成しました。

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

を追加しました。 sbt-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" は、最終的なファット JAR に依存関係を含めないという意味です (これらのライブラリは私のワーカーにすでに含まれています)。

ノート : META-INF の破棄 この回答に触発されて .

ノート : の意味 % %%

これで、SBTを使ってファットJARをビルドできるようになりました( インストール方法 ) を使って、次のコマンドを私の /my-project のルートフォルダで次のコマンドを実行します。

sbt assembly

私のファットJARは、新しく生成された /target フォルダーにあります。

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

誰かのお役に立てれば幸いです。


IntelliJ IDE内にSBTを組み込みたい人のために。 IntelliJ IDEA 内から SBT-assembly タスクを実行するにはどうすればよいですか。