Kuchitama Tech Note

はてな記法がいつまでたっても覚えられないので、はてなダイアリーからマークダウンが使えるこっちに引っ越してきました。

Clojure+LeiningenでJavaFXプログラミング

JavaFX GUIプログラミング〈Vol.1〉をちょいちょい読み始めたので、 JavaFXアプリをClojure + Leiningenで開発する方法についてまとめる。

JavaFX GUIプログラミング〈Vol.1〉

JavaFX GUIプログラミング〈Vol.1〉

プロジェクトの作成

なにはともあれプロジェクトが無くては始まらないのでプロジェクトを作成

lein new javafx

で、とりあえずJavaFXを実行するにはjfxrt.jarが必要。 jfxrt.jarはMacOSXだと /Library/Java/JavaVirtualMachines/jdk1.7.0_09.jdk/Contents/Home/jre/lib/jfxrt.jar にあるっぽいので、そこからコピって来た。 ここのディレクトリにパスが通っていれば問題ないと思うのだけど、デフォでは通ってないっぽい。 作成したプロジェクトディレクトリ直下にlibディレクトリを作成して、その中にjfxrt.jarをコピー。

ただ、手動でjarを追加すると、基本的にLeiningenさんはjarを認識してくれないので、project.cljにjarのパスを追加してやる必要がある。 パスを通すには、:resource-pathsというプロパティを追加してやる。

これでコンパイル時のクラスパスにlib/jfxrt.jarが追加される。 ついでに、:mainを追加して、lein runしたときにちゃんと実行されるように設定しておく。

JavaFX Applicationの作成

準備が完了したので、早速プログラムの作成に入る。 Leiningenのデフォルトだと、src/javafx/core.cljが作成されているのだけど、今回は、自分でsrc/kuchitama/javafx.cljを作成し、そこに実装した。 わざわざ自分でパッケージを切った経緯については、@t_nodaさんと@bouzuyaさんのやり取りを元にしている。詳しくはこちらを参照

で、肝心のプログラムだけどこんな感じ

これで、JavaFX GUIプログラミングのP.8あたりのサンプル相当の実装になる。 こいつをベースにいじって行けば、Clojureでいろいろ出来るハズ

課題

このサンプルだと、lein uberjarを実行したときに、生成されるスタンドアローンなjarの中にjfxrt.jarが含まれないので、実はスタンドアローンで動作しない。 これを解決するには、そもそも手動でのライブラリ追加をやめてちゃんとLeiningenさんに依存関係を解決してもらえばいいのだけど、oracleはjfxrt.jarをmavenで公開していないため、それは不可能になっている。 その対応として自分でローカルのmavenリポジトリを作成して、そこにjfxrt.jarを追加するという方法がある。(参考) 確かに、これが一番オーソドックスな方法だと思うのだけど、僕はわざわざjfxrt.jarだけを管理するためにローカル環境にmavenリポジトリを作りたくはなかったので、今回手動追加という方法をとった。 でも、スタンドアローンなjarがスタンドアローンに動作しないのは詐欺もいいところなのでなんとかしたい。 どなたか、方法をご存知の方がいらっしゃればご教授ください。

Leiningenが便利すぎる [[clojure]] [[Leiningen]]

最近、ClojureというLisp系のプログラミング言語を触っています
で、ClojureにおけるMaven的なツールであるLeiningen(http://github.com/technomancy/leiningen)を使っているのですが、めちゃ便利です。
ひょっとしたら、mavenをラップしているだけかもしれませんが、便利には違いありません。

インストール

インストールは超簡単です

bash$ curl -O http://github.com/technomancy/leiningen/raw/stable/bin/lein
bash$ chmod +x lein

あとは、パスを通してやればすぐに使えます。

コマンド

とりあえず、コマンドはこんな感じ

new (projectname) プロジェクト新規作成
deps 依存ライブラリ取得
repl replを起動する
test テストを実行する

clojar(http://clojars.org/)という、clojureのライブラリをまとめたサイトで、検索して、プロジェクト内のproject.cljにペーストして、

lein deps

これだけで、依存ライブラリの問題が解決します。

Eclipseプロジェクト作成

さらに、LeiningenでEclipseのプロジェクトも作成出来ます。

clojure.cljに
:dev-dependencies を追加

(defproject app-name "1.0.0-SNAPSHOT"
  :description "Write Description"
  :dependencies [
        [org.clojure/clojure "1.1.0"]
        [org.clojure/clojure-contrib "1.1.0"]
  ]
  :dev-dependencies [
        [lein-eclipse "1.0.0"]
  ]
)

terminalから、次を実行

lein deps
lein eclipse

あとは、LeiningenのプロジェクトフォルダをEclipseからインポートするだけ!