Скриптинг Eclipse с Rhino: загрузчик классов принадлежит плагину, предоставляющему Rhino, а не плагину, использующему его - PullRequest
4 голосов
/ 08 февраля 2010

Я использую 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()    
            ) ;

        //[...]
    }

Ответы [ 2 ]

4 голосов
/ 08 февраля 2010

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

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

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

публичный финал void initApplicationClassLoader (загрузчик java.lang.ClassLoader)

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

0 голосов
/ 11 июля 2011

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

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

...