Как получить OSGi BundleContext для приложения Eclipse RCP? - PullRequest
11 голосов
/ 18 февраля 2009

Я только начал работать с приложением Eclipse RCP, это в основном лишь один из предоставленных примеров "Hello World".

Когда приложение загружается, я хотел бы посмотреть на параметры моей командной строки и запустить некоторые службы в соответствии с ними. Я могу получить параметры командной строки в IApplication.start :

public Object start(IApplicationContext context) {
   String[] argv = (String[]) 
       context.getArguments().get(IApplicationContext.APPLICATION_ARGS)));
}

Но как мне получить BundleContext, чтобы я мог зарегистрировать сервисы? Похоже, он отсутствует в IApplicationContext.

Ответы [ 2 ]

14 голосов
/ 16 августа 2009

Только что наткнулся на это, выполняя поиск в сети, и подумал, что буду продвигать новый стандартный способ OSGi R4.2 (предоставленный Equinox, поставляемым с Eclipse 3.5). Если у вас нет активатора и вы не хотите создавать его для кэширования контекста пакета, вы можете использовать FrameworkUtil.getBundle. Изменение предыдущего примера:

import org.osgi.framework.FrameworkUtil;

public class ExportClassDigestApplication implements IApplication {
    public Object start(IApplicationContext context) throws Exception {
        context.applicationRunning();
        BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass())
                                                   .getBundleContext();
    }
}
13 голосов
/ 18 февраля 2009

хитрый внутренний путь:

InternalPlatform.getDefault().getBundleContext()

может это сделать.

Вы найдете пример в этом классе

public class ExportClassDigestApplication implements IApplication {

    public Object start(IApplicationContext context) throws Exception {
        context.applicationRunning();

        List<ExtensionBean> extensionBeans = ImpCoreUtil.loadExtensionBeans(&quot;com.xab.core.containerlaunchers&quot;);
        for (ExtensionBean bean : extensionBeans) {
            ILauncher launcher = (ILauncher) bean.getInstance();
            launcher.start();
        }
        ClassFilter classFilter = new ClassFilter() {
            public boolean isClassAccepted(Class clz) {
                return true;
            }
        };

        PrintWriter writer = new PrintWriter( new File( "C:/classes.csv"));

        Bundle[] bundles = InternalPlatform.getDefault().getBundleContext().getBundles();

Правильный путь :

Каждый плагин имеет доступ к своему собственному контексту пакета.

Просто убедитесь, что ваш подключаемый модуль переопределяет метод start (BundleContext) . Затем вы можете сохранить его в месте, где классы в вашем плагине могут легко получить доступ

Обратите внимание, что контекст пакета, предоставляемый плагину, специфичен для него и никогда не должен передаваться другим плагинам.

...