Clojure+LeiningenでJavaFXプログラミング
JavaFX GUIプログラミング〈Vol.1〉をちょいちょい読み始めたので、 JavaFXアプリをClojure + Leiningenで開発する方法についてまとめる。
- 作者: 大村忠史
- 出版社/メーカー: カットシステム
- 発売日: 2012/09
- メディア: 単行本
- クリック: 2回
- この商品を含むブログ (4件) を見る
プロジェクトの作成
なにはともあれプロジェクトが無くては始まらないのでプロジェクトを作成
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がスタンドアローンに動作しないのは詐欺もいいところなのでなんとかしたい。
どなたか、方法をご存知の方がいらっしゃればご教授ください。