Создание сценариев Eclipse с Rhino: загрузчик классов принадлежит плагину, предоставляющему Rhino, а не плагину, использующему его

Я использую Rhino для создания сценария приложения Eclipse (RCP). Проблема в том, что из Javascript у меня есть доступ только к классам, доступным для плагина, который предоставляет Rhino, а не ко всем классам, доступным плагину, который запускает скрипты.

Очевидным ответом было бы поместить Rhino в плагин сценариев, но это не сработает, потому что он уже предоставлен одним из собственных плагинов приложения (который также предоставляет то, что мне нужно для сценария), и Eclipse всегда использует эту версию вместо версии ближе под рукой.

  • Есть ли способ изменить загрузчик классов, используемый Rhino
  • или можно ли гарантировать, что Eclipse загружает классы Rhino из одного плагина, а не из другого?

Благодаря ответу Тило я использовал это:

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()    
            ) ;

        //[...]
    }

person TomSW    schedule 08.02.2010    source источник


Ответы (2)


Есть ли способ изменить загрузчик классов, используемый Rhino

Rhino должен использовать ContextClassLoader текущего потока. Попробуйте Thread.setContextClassLoader (не забудьте восстановить).

Если это не сработает, возможно, вы сможете создайте свою собственную Rhino ContextFactory:

public final void initApplicationClassLoader (загрузчик java.lang.ClassLoader)

Установите явный загрузчик классов для использования при поиске классов Java.

person Thilo    schedule 08.02.2010
comment
Спасибо, в итоге это было то, что я искал - person TomSW; 08.02.2010

Я не знаю специфики Rhino, но вы можете рассмотреть возможность использования Eclipse «загрузка классов друзей» с политикой «зарегистрированных».

Подключаемый модуль Rhino (скажем, net.weissmann.tom.rhino) объявит себя «открытым для расширения», указав Eclipse-BuddyPolicy: registered в своем MANIFEST.MF. Плагины с классами, которые Rhino должен видеть, должны указывать Eclipse-RegisterBuddy: net.weissmann.tom.rhino и нуждаться в зависимости на уровне пакета от net.weissmann.tom.rhino.

person Woody Zenfell III    schedule 11.07.2011