2013年5月11日土曜日

Scala + SBTでJavaFxを使う

Scala + SBTでJavaFxを使う

Scala + SBTの環境でJavaFxを使って、単純に「Hello World」と表示させてみました。
まずは、SBTからアプリを実行させ、ウィンドウに「Hello World」と表示させます。
次に、ブラウザでこのアプリを表示させてみます。

作業ディレクトリ

今回は、HelloWorldFxというディレクトリの中で作業します。

SBTのダウンロード

次のURLからSBTをダウンロードしてきます。
SBTの現在の最新バージョンは、0.12.3でした。

今回は、ZIP形式をダウンロードしてきました。
そのZIPファイルを適当な場所に解凍します。解凍したディレクトリ中にあるbinディレクトリの中身をすべてHelloWorldFxディレクトリの中にコピーします。

ディレクトリ構成は、以下のようになりました。


$ ls -R
.:
classes  jansi.jar  sbt-launch-lib.bash  sbt-launch.jar  sbt.bat  src  win-sbt

./classes:
SbtJansiLaunch.class

./src:
main

./src/main:
scala

./src/main/scala:
Main.scala

SBTでJavaFxアプリのコンパイルに必要なJARファイル

SBTでJavaFxアプリをコンパイルするには、
jfxrt.jar
が必要です。
このファイルは、Javaがインストールされているディレクトリ(C:\Program Files\Java\jre7など)のlibディレクトリの中にあります。
Javaのインストール時にJavaFxが標準でついてくるのは、Java7の途中からだったと思うので、なければ最新のJavaをインストールする必要があります。

このjfxrt.jarをHelloWorldFx/libにコピーすれば、コンパイルは通るようになるはずです。

ソースコードの場所

ソースコードは、HelloWorldFx/src/main/scala/Main.scalaに作成します。
ウィンドウに「Hello World」と表示させるだけの単純なアプリです。

Main.scala
import javafx.application.Application
import javafx.stage.Stage
import javafx.scene.Scene
import javafx.scene.layout.BorderPane
import javafx.scene.control.Label

class Main extends Application {

  override def start( stage:Stage ) {
    stage.setTitle("HelloWorld")
    stage.setScene(new Scene(new BorderPane {
      setCenter( new Label("Hello World") )
    }))
    stage.show
  }

}

object Main {

  def main( args:Array[String] ) {
    Application.launch( classOf[Main], args:_* )
  }

}

コンパイル

コンパイルします。
$ ./sbt.bat compile

実行に必要な環境変数を設定する

コンパイルは通っても、これだけでは実行できません。
実行するには、$JRE_HOME/binにパスを通す必要があります。

実行

実行します。
$ ./sbt.bat run

ウィンドウに「Hello World」と表示されていれば成功です。

ブラウザで実行する

つぎに、ブラウザ上でアプリを実行させてみます。

用意するもの

  • JARファイル:アプリのJARファイルと、scala-library.jarです。sbtで作る。
  • JNLPファイル:デプロイ情報を記したXMLファイルです。javafxpackagerで作る。
  • HTMLファイル:JavaScriptを記述したHTMLファイル。javafxpackagerで作る。
JNLPとHTMLは、javafxpackagerが作成してくれます。
javafxpackagerは、Java SDKのインストールディレクトリのbinディレクトの中にあります。
このディレクトリへパスを通しておくと良いでしょう。

javafxpackagerを実行すれは、JNLPとHTMLファイルを作成してくれますが、
実行には、scala-library.jarとアプリのJARファイルが必要です。

アプリのJARファイルの作成

アプリのJARファイルは、sbtで簡単に作成できます。

$ ./sbt.bat package

とすれは、HelloWorldFx/target/scala-<version>/に作成されます。
あとでjavafxpackagerで使いやすいように、作成されたjarファイルを
HelloWorldFx/src/main/resourcesにコピーしておきます。

scala-library.jarをコピー

scala-library.jarは、$HOME/.sbt/boot/scala-2.9.2/libにあります。
これも、HelloWorldFx/src/main/resourcesにコピーします。

JNLPファイルとHTMLファイルの作成

JNLPとHTMLを作成する準備が整ったので、javafxpackagerを使ってJNLPとHTMLを作成します。
オプションの「-srcdir」でHelloWorldFx/src/main/resourcesにあるファイルを指定します。
出力先は、「-outdir」で指定します。今回はsrc/main/webappにしました。
実行するmain関数のあるクラスを、「-appclass」で指定します。

$ javafxpackager -deploy -outdir "src\main\webapp" -outfile helloworldfx -width 100 -height 100 -name HelloWorldFx -appclass Main -v -srcdir src\main\resources

HTMLファイルがsrc/main/webappに作成されているはずです。
作成されたHTMLファイルをブラウザで表示させれば、完了です。

※セキュリティの設定でブラウザで表示できない場合もあります。そのときは、コントロールパネルからJavaのセキュリティ設定を変更してください。

0 件のコメント:

コメントを投稿