jrubyからJavaのクラスを扱う

jrubyJavaのクラスを扱うときはどうしたらよいのか?
最初、ドキュメントがぱっと見つけられなくてちょっと困った。
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",
...