用Rhino编写Eclipse脚本:classloader属于提供Rhino的插件,而不是使用它的插件

时间:2010-02-08 09:37:45

标签: eclipse-plugin eclipse-rcp rhino eclipse-pde

我正在使用Rhino来编写Eclipse(RCP)应用程序的脚本。问题是,从Javascript我只能访问提供Rhino的插件可用的类,而不能访问运行脚本的插件可用的所有类。

显而易见的答案是将Rhino放入脚本插件中,但这不起作用,因为它已经由应用程序自己的一个插件提供(它还提供了我需要脚本的东西),Eclipse总是使用这个版本而不是更接近手的版本。

  • 有没有办法更改Rhino使用的类加载器
  • 或者是否可以确保Eclipse从一个插件而不是另一个插件加载Rhino类?

感谢Thilo的回答我使用了这个:

import net.weissmann.tom.rhino.Activator;  // Plugin activator class
import org.mozilla.javascript.tools.shell.Main;

public class JSServer extends Thread {

    //[...]

    public void run() {
        // recent versions of the Main class kindly export
    // the context factory
        Main.shellContextFactory.initApplicationClassLoader(
                Activator.class.getClassLoader()    
            ) ;

        //[...]
    }

2 个答案:

答案 0 :(得分:4)

  

有没有办法改变Rhino使用的类加载器

Rhino应该使用当前Thread的ContextClassLoader。试试Thread.setContextClassLoader(别忘了恢复它)。

如果这不起作用,也许你可以create your own Rhino ContextFactory

  

public final void initApplicationClassLoader(java.lang.ClassLoader loader)

     

设置显式类加载器以在搜索Java类时使用。

答案 1 :(得分:0)

我不了解Rhino的具体内容,但你可以考虑将Eclipse“buddy classloading”与“注册”策略一起使用。

Rhino的插件(例如net.weissmann.tom.rhino)会通过在Eclipse-BuddyPolicy: registered中指定MANIFEST.MF来声明自己“对扩展开放”。具有Rhino应该能够看到的类的插件将指定Eclipse-RegisterBuddy: net.weissmann.tom.rhino,并且需要net.weissmann.tom.rhino上的包级依赖。