= sbt-assembly = [[https://github.com/eed3si9n/sbt-assembly]] == 概要 == アプリのclassファイルとそれが依存するライブラリのclassファイルを一つの大きなjarファイルにする。 そのため、この単一のjarファイルを配布するだけでよく、実行時に依存jarをダウンロードする必要も、クラスパスを設定する必要も無い。 ただし、必要なものをすべて入れ込んでしまうため、HelloWorldでも20Mバイト程度のjarになる。 MainClassは自動検出されるが、明示的に指定することもできる。 使い方はとても簡単。 == 基本的な使い方 == 以下ではsbt-0.11、Scala-2.9.1、sbt-assembly-0.7.1(2011/10/1)を前提としている。 === プラグインの指定 === project/plugins.sbtを作成して以下を記述 {{{ addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.7.1") // あるいは他のバージョン }}} === .sbtあるいは.scalaビルド定義の記述 === build.sbtに以下を記述 {{{ import AssemblyKeys._ // put this at the top of the file seq(assemblySettings: _*) }}} あるいは、build.sbtの代わりにproject/Build.scala中のsettingsに以下を記述 {{{ sbtassembly.Plugin.assemblySettings: _* }}} ※他のsettingもある場合は、それらとは混ぜないようにしないといけない。 {{{ import sbt._ import Keys._ import sbtassembly.Plugin._ import AssemblyKeys._ object MyBuild extends Build { lazy val myProject = Project("myProject", file(".")) settings( // これは自分の定義 libraryDependencies += "org.scala-tools" % "subcut_2.9.0" % "0.9", retrieveManaged := true, unmanagedSourceDirectories in Compile <+= baseDirectory{ _ / "src"} ) settings(assemblySettings: _*) } }}} === assemblyの確認 === この状態で、assemblyが読み込まれていることを対話モードで確認 {{{ > a <-- タブを押す about add-default-commands alias all-dependencies app-configuration append artifact artifact-classifier artifact-name artifact-path artifacts assembly assembly-assemble-artifact assembly-default-jar-name assembly-excluded-files assembly-excluded-jars assembly-jar-name assembly-option assembly-output-path assembly-package-dependency assembly-package-scala auto-compiler-plugins auto-scala-library }}} あとは対話モードで {{{ > assembly }}} とすれば「target/scala_2.9.1/プロジェクト名-assembly-バージョン.jar」というファイルが作成される。 最低でも20Mバイトのファイルになるので非常に時間がかかる。 == オプション == これらはbuild.sbtに記述する。 * メインクラスを指定する {{{ mainClass in assembly := Some("foobar.Hello") }}} * 生成されるjar名称を指定する {{{ jarName in assembly := "something.jar" }}} * scala-compiler.jarは不要 {{{ excludedJars in assembly <<= (fullClasspath in assembly) map { cp => cp filter { _.data.getName == "scala-compiler.jar" } } }}} すべて同時に指定した例 {{{ import sbt._ import Keys._ import sbtassembly.Plugin._ import AssemblyKeys._ object MyBuild extends Build { lazy val myProject = Project("myProject", file(".")) settings( libraryDependencies += "org.scala-tools" % "subcut_2.9.0" % "0.9", retrieveManaged := true, unmanagedSourceDirectories in Compile <+= baseDirectory{ _ / "src"} ) settings(assemblySettings: _*) settings( mainClass in assembly := Some("foobar.Hello"), jarName in assembly := "something.jar", excludedJars in assembly <<= (fullClasspath in assembly) map { cp => cp filter { _.data.getName == "scala-compiler.jar" } } ) } }}}