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