sifue's blog

プログラマな二児の父の日常

Scala+sbt+EclipseでUTF-8文字とUIを含む実行jarのアプリケーション作成、開発方法

sbt0.11.3以上をお使いの方はこちら


全国のScalaファンのみなさん、こんにちわ!
最近よくScalaをいじっていることもあって、Scalaを使ってUTF-8の文字を表示しつつ、SwingのUIなんかを表示させる実行jarを作ったりすることがあり、いろいろと開発環境の設定が面倒くさい所もあるのでその手順をまとめておきました。
Scalaを使って日本語を使ったUIを表示させることのできる実行jarをビルドするHelloWorld!と考えてもらえれば良いです。無論、UTF-8文字やUIを含まなくてもこの方法でビルドできます。

まず使っている使っている環境です。

となります。


というわけで、早速はじめていきます。プロジェクト名をhelloswingにしてにしてありますが、その辺は適宜変更して使って下さい。ちなみに、自分のワークスペースは、

 $ cd ~/Dropbox/Dev/sbt

というパスから開始してやっていますが、その辺も適宜調整お願いします。

sbtのプロジェクトの作成

 $ mkdir helloswing
 $ cd helloswing
 $ mkdir -p src/main/scala
 $ mkdir -p src/test/scala
 $ echo 'import javax.swing.JOptionPane; object Helloswing { def main(args: Array[String]) = JOptionPane.showMessageDialog(null, "こんにちわ!世界!") }' > src/main/scala/Helloswing.scala
 $ vim build.sbt

ここまでで、Mavenでよく使われているフォルダ構成の作成とMainにてダイアログを表示させる処理を実装しました。最後にbuild.sbtを編集します。別にvimでなくてもお好きなエディタで以下のような内容にします。

name := "helloswing"

version := "1.0"

scalaVersion := "2.9.1"

これで、プロジェクトは完成です。
ビルド後、実行してみましょう。

$ sbt
  > run


以上のようなメッセージダイアログが出ればプログラムは完成です!
Ctrl+Dでsbtは終了させることができます。

実行jarのビルド

というわけで今度はここから実行jarを作成できるようにします。そのためにprogaurdというsbtのプラグインをインストールしていきます。
siasia/xsbt-proguard-plugin · GitHub
以上の本家を参考にしていますが、sbt 0.11.1とsbt0.11.2でフォルダ構成が違うので要注意です。では進めていきます。

 $ mkdir project
 $ vim project/plugins.sbt

場合によっては、projectフォルダは既にあるかもしれません。次に以下を追記します。

libraryDependencies <+= sbtVersion(v => "com.github.siasia" %% "xsbt-proguard-plugin" % (v+"-0.1.1"))

これがプラグインの依存関係を追加する設定です。

 $ mkdir project/project
 $ vim project/project/Build.scala

次に以下を追記します。

import sbt._
object PluginDef extends Build {
	override def projects = Seq(root)
	lazy val root = Project("plugins", file(".")) dependsOn(proguard)
	lazy val proguard = uri("git://github.com/siasia/xsbt-proguard-plugin.git")
}

これは依存関係がなかったらGitHubからダウンロードしてくるという設定です。

 $ vim build.sbt

以上を編集して、以下の用に処理を開始するprogaurdの設定の読み込みと、Mainのobjectの設定を追記します。

name := "helloswing"

version := "1.0"

scalaVersion := "2.9.1"

seq(ProguardPlugin.proguardSettings :_*)

proguardOptions += keepMain("Helloswing")

これでOK。
最後に、scala-liblary.jarをlibフォルダに同梱して、実行jarをビルドしてみましょう。

 $ mkdir lib
 $ cp /usr/local/Cellar/scala/2.9.1-1/libexec/lib/scala-library.jar lib
 $ sbt
   ..
   > update
   ..
   > proguard
   ..
   [success] Total time: 30 s, completed 2012/04/14 17:08:37

これで実行jarの作成完了です。


実行jarの場所は、以上のスクリーンショットのように

target//.min.jar

という形式になります。minがついていないものはscala-library.jarが含まれていないものです。


というわけで、helloswing_2.9.1-1.0.min.jarをダブルクリックしてみましょう。以下のように表示されれば、実行jarビルドは成功です。

Eclipseへのインポート及びデバッグ実行

さて、これを今度はEclispseで動かしてみたいと思います。そのためにtypesafehub/sbteclipse · GitHubというプラグインを使います。このサイトの手順にしたがって、

 $ vim project/plugins.sbt

以上のファイルを編集し、依存関係を追加します。

libraryDependencies <+= sbtVersion(v => "com.github.siasia" %% "xsbt-proguard-plugin" % (v+"-0.1.1"))

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.0.0")

最後の一行を追加して最終的にこのようになります。Eclipseに読み込む設定をします。

 $ sbt
   > eclipse
   [info] About to create Eclipse project files for your project(s).
   [info] Successfully created Eclipse project files for project(s): helloswing

これで完了です。とは以下のようにScala IDEをインストールしたEclipseに読み込みます。


プロジェクトエクスプローラーの右クリック > Import > General > Existing projects into workspaceから、以下のようにコピーをせずにインポートしましょう。(でないと同期してくれなくなります)


じつは、ここからが肝で、エラーが出るのでそれを解消します。まず、プロジェクトエクスプローラーで、helloswingのルートノードを選択して、右クリック > Propertiesから。



Java Build Pathに重複している、Scala Libraryの取り除きを行います。



次に、ResourceからText file encodingがSJISになっているので、UTF-8に変更します。

UTF-8



最後に、Scala Compilerで、プロジェクトの設定を使うようにして、追加コマンドライン引数に-encoding UTF-8加えます。

-encoding UTF-8



これでOKです。早速Helloswing.scalaを開いて、右クリック > Debug As .. > Scala Applicationsからデバッグしてみましょう。



これで無事起動出来ればOKです。無論、ブレークポイントを貼ってデバッグすることもできますので、あとはお好きに。
実行jarの作成は、sbtから行いますので sbt→updatem→proguardという手順でビルドできます。あとはJenckinsにsbtのプラグインを入れてデイリービルドなり、デイリーテストなりをやってみてください。


あと、sbtで依存ライブラリを追加する際には、再度eclipseコマンドを実施してインポートの手順を踏むことでうまくいきます。


以上です。お疲れ様でした。