jrubyからJavaのクラスを扱う
jrubyでJavaのクラスを扱うときはどうしたらよいのか?
最初、ドキュメントがぱっと見つけられなくてちょっと困った。
https://github.com/jruby/jruby/wiki/CallingJavaFromJRuby
まず最初のおまじない、require 'java' しておく。
・Jarファイルの読み込み
requireを使えばよい。直接ファイルパスを書くか、グローバル変数$LOAD_PATH
またはシェルの環境変数CLASSPATHにJarファイルを置いて、ファイル名のみ指定する。
・classファイルの読み込み
コマンドラインまたは環境変数CLASSPATHでクラスパスを指定する。このあたりはjavaと同じ。
$ jruby -J-cp [クラスパス] ... または $ export CLASSPATH=/path/to
グローバル変数 $CLASSPATH も使える。この変数は上記で指定された内容と関係ない(初期状態は空の配列)。
$CLASSPATH << '/path/to'
クラス名だけで参照したい場合はimportする。
importもjava_importも同じだが、jrubyの新しいバージョンではjava_importがおすすめのよう。
javaやorgで始まるパッケージなどは、文字列にしなくてもよい(このへんでちょっとはまった)。
import 'foo.bar.Baz' または java_import 'foo.bar.Baz'
試してみる。
hiro@Mac-mini% find ./classes ./lib -type f ./classes/foo/bar/Baz.class ./lib/servlet-api.jar
hiro@Mac-mini% cat a.rb require 'pp' require 'java' require '/Users/hiro/devel/ruby/sandbox/lib/servlet-api.jar' $CLASSPATH << './classes' p java.lang.System p javax.servlet.Servlet p Java::foo.bar.Baz # foo.bar.Bazだとエラーになる java_import java.lang.System java_import javax.servlet.Servlet java_import 'foo.bar.Baz' p System p Servlet p Baz p Java.class pp Java.constants
hiro@Mac-mini% jruby a.rb Java::JavaLang::System Java::JavaxServlet::Servlet Java::FooBar::Baz Java::JavaLang::System Java::JavaxServlet::Servlet Java::FooBar::Baz Module ["JavaLang", "JavaProxyClass", "JavaNio", "JavaConstructor", "JavaField", "Javax", "JavaProxyMethod", ...