Locked History Actions

sbt/sbt-assembly

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" }        
      }
  )
}