読者です 読者をやめる 読者になる 読者になる

日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

JavaFX でちょっとばかり遊んでみた(2)

Clojure JavaFX

結構前に JavaFX でちょっとばかり遊んでみた - 日曜プログラミング と言う記
事を挙げたが、その時結局 uberjar 後の実行ができなかったと言う宿題を片付ける。

JavaFXMaven 管理下に置く

やり方はちょっと前に上げたこちらで。
JavaFX のバージョン確認方法はこちらで。

今回のコマンドはまさに tnoda さんの所のサンプルほぼそのままになるが、フルパス指定めんどく
さいんでコマンド実行するカレントディレクトリに jfxrt.jar を一時的にコピっておく。

mvn install:install-file -DgroupId=local.oracle -DartifactId=javafxrt -Dversion=2.2.25 -Dpackaging=jar -Dfile=jfxrt.jar

無事コマンド実行終わったらコピった jar は削除して良い。

project.clj の設定を合わせる

leiningen プロジェクト名を fxhello とします。
前回からちょっと変わった部分が出てるので再度コード載せる。

前回と変わったのは :dependencies の方に依存関係を記述するようになった点のみ。

(defproject fxhello "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [local.oracle/javafxrt "2.2.25"]] ; 追加
  :aot [fxhello.core]
  :main fxhello.core)

試しに :aot 指定外してみたんだがここはやはり必須なのね。

core.clj

launch メソッドで名前空間の指定を忘れずにと言った所か。

(ns fxhello.core
  (:import [javafx.application Application]
           [javafx.stage Stage]
           [javafx.scene Scene layout.HBox control.Label])
  (:gen-class
   :extends javafx.application.Application))

(defn -start [this stage]
  (let [hbox (HBox.)
        scene (Scene. hbox)]
    (.add (.getChildren hbox) (Label. "はろー"))
    (doto stage
      (.setScene scene)
      (.setTitle "Hello")
      (.show))))

(defn -main [& args]
  (javafx.application.Application/launch fxhello.core args)) ; 変更点

これで uberjar してできた jar を実行してみると無事動いた。

宿題(ペンディング)

これだと依存ライブラリまるまる取り込んでしまうため、こんな単純な helloworld アプリでも
18MB 近くにまでなってしまう。必要最低限のクラスファイルだけ取り込んでビルドみたいな事はで
きないものか。

軽く30分くらいググってみたけど見つからなかったのでしばらくこれは置いておく。