子 ClassLoader 内でブロックを呼び出せるように、JRuby と直接統合したいと考えています。
目標は、Jar のリストをカスタム ClassLoaderに渡して、ブロックの実行のためにロードすることです。私が抱えている問題は、デフォルトの代わりに新しい ClassLoader を使用するように JRuby ランタイムに指示することです。私が今持っているのはちょっとしたハックcreate(string class)
です。カスタム ClassLoader を使用してインスタンスを構築するために手動で呼び出します。
LockJarを使用してファイルから Jar のリストを取得するこのRubyの使用方法の例:tmp/IsolateJarfile.lock
email = LockJar::ClassLoader.new( 'tmp/IsolateJarfile.lock' ).isolate do
email = new_instance( 'org.apache.commons.mail.SimpleEmail' )
email.setSubject( 'test subject' )
email
end
email.getSubject().should eql 'test subject'
これは機能し、SimpleEmail は子 ClassLoader で作成されます。デフォルトの JRuby クラスパスは変更されていません。への呼び出しnew_instance( 'org.apache.commons.mail.SimpleEmail' )
は醜いです。理想的org.apache.commons.mail.SimpleEmail.new
には、呼び出すことができ、JRuby ランタイムはデフォルトの JRuby クラスローダではなくカスタム クラス ローダからプルします。ブロック実行中に変更してみThread.currentThread().setContextClassLoader
ましたが、うまくいきませんでした。JRuby のソースをいくつか調べてみましたが、ClassLoader にフックする良い方法がわかりませんでした。