Как получить OSGi BundleContext для приложения RCP Eclipse?

Я только что начал работу с RCP-приложением Eclipse, это в основном только один из предоставленных образцов "hello world".

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

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

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

Ответ 1

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

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). Затем вы можете сохранить его на классы места в своем подключаемом модуле, легко получив доступ к

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

Ответ 2

Только что наткнулся на это, сделав веб-поиск, и подумал, что я бы продвинул новый стандартный способ 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();
    }
}