Есть ли эквивалент BundleActivator для проектов фрагментов Eclipse?

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

У меня не может быть Bundle-Activator в проекте фрагмента. Поэтому мне интересно, есть ли какой-нибудь альтернативный механизм для объявления точки входа или какой-нибудь обратный вызов, который я могу подключить?

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

Это решение, которое я использовал на основе принятого ответа:

final IExtensionRegistry registry = Platform.getExtensionRegistry();
final IExtensionPoint extensionPoint = registry.getExtensionPoint("myextensionid");
final IExtension[] extensions = extensionPoint.getExtensions();
for (int j = 0; j < extensions.length; ++j)
{
    final IConfigurationElement[] points = extensions[j].getConfigurationElements();
    for (int i = 0; i < points.length; ++i)
    {
        if ("myelementname".equals(points[i].getName()))
        {
            try
            {
                final Object objImpl= points[i].createExecutableExtension("class");
                objImplList.add(provider);
            }
            catch (CoreException e)
            {
            }
        }
    }
}
13.12.2008 23:45:58
Этот вопрос должен служить примером того, как использовать stackoverflow. Спасибо!
Urs Reupke 18.01.2009 11:03:31
1 ОТВЕТ
РЕШЕНИЕ

Вы можете определить точку расширения и искать / вызывать ваши фрагменты классов через расширения.

    IExtensionRegistry registry = Platform.getExtensionRegistry();
    IExtensionPoint extensionPoint = registry
            .getExtensionPoint("myplugin.myextension");
    IConfigurationElement points[] = extensionPoint
            .getConfigurationElements();
    for (IConfigurationElement point : points) {
        if ("myextensionFactory".equals(point.getName())) {
            Object impl = point.createExecutableExtension("class");
            if (impl instanceof IMyExtension) {
                ((IMyExtension) impl).foo();
            }
        }
    }
}

РЕДАКТИРОВАТЬ:

Чтобы использовать этот подход, я должен преобразовать свои проекты фрагментов в проекты плагинов. - bmatthews68

Тебе не нужно это делать. Например, в моем тестовом коде у меня есть следующие файлы в плагине хоста:

META-INF / MANIFEST.MF :

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Myplugin Plug-in
Bundle-SymbolicName: myplugin;singleton:=true
Bundle-Version: 1.0.0
Bundle-Activator: myplugin.Activator
Require-Bundle: org.eclipse.core.runtime
Eclipse-LazyStart: true
Export-Package: myplugin

plugin.xml :

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
    <extension-point id="myextension" name="myextension"
        schema="schema/myextension.exsd" />
</plugin>

Фрагмент содержит эти файлы:

META-INF / MANIFEST.MF :

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Myfragment Fragment
Bundle-SymbolicName: myfragment;singleton:=true
Bundle-Version: 1.0.0
Fragment-Host: myplugin;bundle-version="1.0.0"

фрагмент.xml :

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<fragment>
   <extension
         point="myplugin.myextension">
      <myextensionFactory
            class="myfragment.MyExtension1">
      </myextensionFactory>
   </extension>
</fragment>

Эти проекты были созданы с использованием Eclipse 3.3.1.1.

6
15.12.2008 11:08:27
Благодаря вашему ответу я смог заставить эту функцию работать в моем плагине с первой попытки. Спасибо за помощь.
Brian Matthews 15.12.2008 11:05:52