Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

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