我想直接与 JRuby 集成,以便可以在子 ClassLoader 中调用块。
目标是将 Jars 列表传递给自定义 ClassLoader以加载以执行块。我遇到的问题是告诉 JRuby 运行时使用新的 ClassLoader 而不是默认值。我现在拥有的是一个 hack,它手动调用create(string class)
使用自定义 ClassLoader 构造一个实例。
对于这个Ruby,它使用LockJar从文件中获取 Jars 列表,它是如何使用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 的好方法。