我想直接与JRuby集成,因此可以在子类ClassLoader中调用块。
目标是将要传递给custom ClassLoader的Jars列表加载以执行块。我遇到的问题是告诉JRuby运行时使用新的ClassLoader而不是默认值。我现在拥有的是一个黑客,它手动调用create(string class)
来使用自定义ClassLoader构建实例。
对于Ruby,LockJar使用example从文件tmp/IsolateJarfile.lock
获取Jars列表,{{3}}如何使用它:
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的好方法。