我正在使用Rhino来编写Eclipse(RCP)应用程序的脚本。问题是,从Javascript我只能访问提供Rhino的插件可用的类,而不能访问运行脚本的插件可用的所有类。
显而易见的答案是将Rhino放入脚本插件中,但这不起作用,因为它已经由应用程序自己的一个插件提供(它还提供了我需要脚本的东西),Eclipse总是使用这个版本而不是更接近手的版本。
感谢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()
) ;
//[...]
}
答案 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
上的包级依赖。