3

子 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 にフックする良い方法がわかりませんでした。

4

0 に答える 0