Scalaで小さいAppletを作る8手順

グラフィカルなアプリケーションをScalaで作ったら公開したくなりますよね。
となれば、Appletを使いたくなります。
ここで問題になるのがScalaのランタイムライブラリであるjarファイルのサイズが結構でかいことです。
Proguardというソフトを使って圧縮をすることでjarファイルが劇的に減らすことが広く知られています。
しかしながら、問題はその作り方がよく分からないってことでした。
ということで、ひとつバッチファイル一発でappletが作れるサンプルを作ってみました。


やりかたは以下の8手順です。8と言っていますが肝は2〜6です。

1.アプレット用のフォルダを作る
2.proguard.jar (scalaのソースプログラム)をダウンロード
3.app.scala (scalaのソースプログラム)を書く
4.app.html (アプレット表示用html)を作成する
5.appm.bat (バッチファイル)を作成する
6.app.txt (proguard用設定ファイル)を書く
7.appm.bat (バッチファイル)を実行する
8.app.htmlを開く


1.まずは適当にappとかいうフォルダを作ります。


2.次に、proguardをsourcefogeのサイトからダウンロードしてきます。
アドレスは、ここから、ここいって、このファイルになります。
そして、ファイル中のlib以下にあるproguard.jarを取り出して、appフォルダに置きます。


3.app.scalaを書きます。たとえばこんな感じです。

import java.awt._
import java.applet._

case class HelloWorld()

class app extends Applet {
  override def paint(g:Graphics) {
    val hoge = HelloWorld()
    g.drawString(""+hoge, 20, 20)
  }
}

いちお、scalaっぽさを出すために無駄にcase classを作ってます。
これも、appフォルダに入れておきましょう。


4.アプレットを開くためのapp.htmlを作ります。

<html>
<title>Hello World Applet</title>
<body>
<applet code="app" archive="app.jar" width=100 height=100>
</applet>
</body>
</html>


5.appm.batというバッチファイルを作ります。windows以外のOSであれば、シェルスクリプトになるかと思います。

call scalac app.scala
jar cvfM app.jar *.class
java -jar proguard.jar @app.txt

最初にscalacでコンパイルして、jarファイルで圧縮した後、proguard.jarを実行するというものです。
cvfMのMはjarファイルにManifestファイルを入れないオプション。
@app.txtというのは、proguard用の設定ファイルの名前です。


6.では、app.txtというproguard用の設定ファイルを作ります。

-dontusemixedcaseclassnames
-dontoptimize
-injars      app.jar;'c:/Program Files/Scala/lib/scala-library.jar'(!META-INF/MANIFEST.MF,!library.properties)
-outjars     app.jar
-libraryjars <java.home>/lib/rt.jar
-keep public class app

中身はこんな感じです。
injarsの'c:/Program Files/Scala/lib/scala-library.jar'は適当に書き換える必要があるかもしれません。
この設定をどうするんだ−ってところがかなり悩む部分です。

7.後はapp.batを実行してビルドします。


8.app.htmlを開いてHelloWorld()と表示されたら成功です。Conglatination!! おめでとうございます。


ということで、できた、jarファイルの中身はちゃんと圧縮されて、a,b,cっていう名前のクラスやら
フォルダが沢山並んでます。
今回作ったアプレットは12.4kbyteです。PCで使うなら十分小さいですよね。
さ、これで思う存分、scalaアプレットを書くぞーっと!!