sbt で実行可能な jar を生成

scala 製アプリを1つの実行可能な jar ファイルにまとめたくなった。sbt にデフォルトでついている package アクションでは、依存するライブラリが jar には含まれないため不十分。今回は、sbt-proguard-plugin を利用することで対応した。ProGuardJavaの組込み向けにアーカイブの軽量化、最適化、難読化する目的で作られたアプリケーションらしい。

例えば、以下のような src/main/scala/Hello.scala が実行可能な jar を生成したい。

object Hello {
  def main(argv: Array[String]): Unit = {
    println("Hello")
  }
}

1.プラグインの組込み

project/plugins/Plugins.scala を以下のように作成する。

import sbt._

class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
  val proguard = "org.scala-tools.sbt" % "sbt-proguard-plugin" % "0.0.5"
}

2.プロジェクトの設定

project/build/Project.scala に以下を追加する。

import sbt._

class Project(info: ProjectInfo) extends DefaultProject(info) with ProguardProject  {
  override def proguardOptions = List(
    proguardKeepMain("Hello"),
    proguardKeepAllScala
  )
  override def proguardInJars = super.proguardInJars +++ scalaLibraryPath
}

3. sbt コマンドでビルド

あとは、sbt コマンドで proguard アクションを実行。

 $ sbt clean reload update proguard

4. 完成

target/scala_X.X.X/my-project-X.X.min.jar のような jar が生成されていれば、

 $ java -jar target/scala_X.X.X/my-project-X.X.min.jar

で実行できる。