: O. Yuanying

BSFでJRubyを使う

JRubyのBean Scripting Framework (BSF) supportに関する記述が英語であったためまとめる。

使用方法

// BSFManagerを生成する。
BSFManager manager = new BSFManager();

// 必要があれば、
// Javaのオブジェクトをスクリプト内で使用できるグローバル変数として登録できる。
manager.declareBean("frame", aFrame, JFrame.class);

// スクリプトの実行。
manager.exec("ruby", "(java)", 1, 1, "$frame.setTitle(\"A Frame\")");

// または、返り値を持つスクリプトの実行。
Object obj = manager.eval("ruby", "(java)", 1, 1, "(1..10).collect { |e| e ** 2 }.first");
int result = ((Integer)obj).intValue();

BSFとJRubyと使えばSwingをRubyから簡単に扱うことができる。Rubyから動的にSwingのフォームやウィンドウを追加したり変更したりできるサンプルは結構感動もの。

補足1

BSFManager.registerScriptingEngine("ruby", "org.jruby.javasupport.bsf.JRubyEngine", new String[] { "rb" });

尚、上記のようにJRubyのエンジンをBSFManagerに登録する必要があると元のドキュメントにあるが、BSFのバージョン2.3.0以降ではすでに登録されているため必要ない。

補足2

Rubyのライブラリ探索パスがデフォルトでは、

  1. /opt/tomcat/bin/bootstrap.jar
  2. /usr/java/jdk1.5.0_04/lib/tools.jar
  3. .

となっているため、通常のRubyに含まれているライブラリを使用する前には以下のように指定してやる必要がある。

$:.unshift "/usr/lib/site_ruby/1.8",
	"/usr/lib/site_ruby/1.8/i386-linux", 
	"/usr/lib/site_ruby", 
	"/usr/lib/ruby/1.8", 
	"/usr/lib/ruby/1.8/i386-linux"

当然、オリジナルのRubyをインストールをしておく必要がある。