ScalaをJar化してみる


ScalaはJavaVM上で動くのでコンパイルしてclassファイルを出力することができます。
classファイルをまとめてjar化して様々な環境で動かしてみたいという欲求を満たしましょう。


ちょっとしたことを忘れるとはまってしまうのでここに記しておきます。




まず、コンパイルです。
ここで注意するべき点はmainメソッドを含むobjectを作ることですね。
例えば以下のような例が挙げられます。

// hello.scala
object HelloWorld
{
    def main(args:Array[String]) = println("HelloWorld!")
}

objectのキーワードはシングルトンであるので静的のように振舞います。
(簡単に言うとC/C++Javaでいうstaticみたいなものです。…ちょっと違いますが)



まずこれをコンパイルします。

scalac hello.scala


成功すると以下のclassファイルが出力されます。
・HelloWorld.class
・HelloWorld$.class


実行してみて以下のようになれば成功しています。

>scala HelloWorld
HelloWorld


そして、jar化します。
この時に注意してほしいことはscalaのclassにはscala-library.jarというものが必要になってきます。
classpathで設定してもいいのですが今回は埋め込みます。


まず、scala-library.jarをコピーしてきます。(同じディレクトリに入れとくといいと思います)
ubuntuの場合 /usr/java/scla-library.jar というところにあります。


持ってきたら解凍しましょう。(jarのままだとうまくいきません)

jar xf scala-library.jar

解凍するとscala/というディレクトリが生成されます。




次にマニフェストファイルを作ります。
manifest.mfとでもしておきましょうか。

Manifest-Version: 1.0
Main-Class: HelloWorld
Class-Path: scala-library.jar

:の後に半角空白を入れないと動かないみたいです。




マニフェストファイルを作ったらいよいよjarファイルを作ります。

jar cfm hello.jar manifest.mf *.class scala

とやるとclassファイルとscala-libraryがパッキングされて、hello.jarが生成されます。

> java -jar hello.jar
HelloWorld

これで成功です。




以上の作業をまとめてbuild.shとするのもいいかもしれません。

scalac *.scala
jar cfm xxx.jar manifest.mf *.class scala

これで簡単にビルドできますね。