LoginSignup
4
2

More than 5 years have passed since last update.

JRubyFXのfxml_rootをjarパッケージング時にも適切に動作する形で設定する

Last updated at Posted at 2015-05-01

JRubyFXでは、コントローラーにてビュー(fxmlファイル)を読み込む際、fxmlメソッドを用いfxmlファイルの名前を指定しますが、ここで指定したファイル名はあらかじめfxml_rootメソッドで設定してあるディレクトリからの相対パスとして探索されます。

例えば、実行されるrubyファイルと同じディレクトリに輿水幸子.fxmlファイルが存在する場合は、以下の様なコードとなります。

fxml_root File.dirname(__FILE__)
class KawaiiController
  include JRubyFX::Controller
  fxml "輿水幸子.fxml"
end

更に、このJRubyアプリケーションをjarファイルとしてパッケージングした際にも正常に動作させるためには、fxml_rootの第二引数に、実行されるjarファイルそのもののファイル名を指定する必要があります。

第二引数にnil以外の値を指定した場合、第一引数として渡した値は使われません。ですので、jarファイルとして実行されている場合は自分自身のファイル名、そうでない場合はnilを返すメソッドを定義し、そのメソッドを呼び出した返り値を第二引数として渡す形にしておけば、現在実行されている環境がjarファイル内なのかどうかを意識せず、動的にfxml_rootへ適切な値を設定できるようになります。

そこで、jarファイルとしてパッケージングしたJRubyアプリケーションを実行した際、$LOAD_PATHにjarファイル自身が含まれるようになるという仕様を利用し、以下のようなjar_filenameメソッドを追加しましょう。

def jar_filename
  $LOAD_PATH.map{|it|
    it.split('/')
  }.flatten.uniq.select{|it|
    it.match /^(?!jruby-complete\.jar!)(?!jruby-stdlib-[0-9\.]+\.jar!).+\.jar!$/
  }.first.tap{|it| break it.tr('!','') unless it.nil?}
end
fxml_root File.dirname(__FILE__), jar_filename

いいですね。JRubyFXにはJRubyFX::Application.in_jar?という便利メソッドもあるので、jarファイルの名前が予めわかっている場合には、単に条件分岐でfxml_rootを呼んでしまえば良いでしょう。例えばjarファイルの名前が乙倉悠貴.jarだとわかっている場合は以下の様なコードになります。

if JRubyFX::Application.in_jar?
  fxml_root nil, '乙倉悠貴.jar'
else
  fxml_root File.dirname(__FILE__)
end

ただし、jarファイルの名前はユーザーが変更してしまう事も有り得ますので、$LOAD_PATHから動的に取得する方法の方がより安心かもしれません。

fxml_rootの仕様はドキュメント化されていませんので、より詳しく知りたい方はこの辺りのコードを読むと良いと思います。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2