JRubyをJSR223を使って呼び出す−解決編
というわけで解決いたしました。
・・・原因はこちらです。
ScriptEngineManager
public ScriptEngineManager(ClassLoader loader)
このコンストラクタは、サービスプロバイダ機構を使用して、
指定された ClassLoader に可視の ScriptEngineFactory の実装をロードします。loader が null の場合、プラットフォームにバンドルされ、
通常の拡張ディレクトリ (インストール型拡張機能) に存在するスクリプトエンジンファクトリがロードされます。パラメータ:
http://java.sun.com/javase/ja/6/docs/ja/api/javax/script/ScriptEngineManager.html#ScriptEngineManager(java.lang.ClassLoader)
loader - スクリプトエンジンファクトリの検出に使用する ClassLoader。
このコンストラクタで指定したClassLoader ですが、ScriptEngineの生成時には使用されますがそれ以降は使用されないのです。
えーって感じですよ、常識的に考えてここでClassLoader指定したら、そのScriptEngineで使用されれるClassLoaderまで影響範囲が及ぶかと思うじゃないですか。そんなカンチガイから生まれたバグでした。
結局・・・
- ClassLoaderが指定された時は、JRubyのクラスが見えるから問題なし
- 実行時などに必要なクラスを、カレントのClassLoaderから探そうとしてClassNotFoundException
というオチでした。
解決方法としては、スクリプト言語毎に実行用のスレッドを用意し、そのスレッドのClassLoaderを置き換えるという形で行いました。これで、GroovyとJRubyの両方が同時にテストが通るようになりました。