3

我想直接与 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 的好方法。

4

0 回答 0