4 Stimmen

Gibt es eine Entsprechung zu BundleActivator für Eclipse-Fragment-Projekte?

Ich baue ein Eclipse-Plug-in, das eine Reihe von Kernfunktionen im regulären Plug-in-Projekt bietet. Die optionalen Funktionen stelle ich über Fragment-Projekte bereit. Aber ich brauche die Fragmente, um sich selbst mit dem Haupt-Plug-in beim Start zu registrieren.

Ich kann keinen Bundle-Activator im Fragment-Projekt haben. Ich frage mich also, ob es einen alternativen Mechanismus gibt, um einen Einstiegspunkt oder einen Rückruf zu deklarieren, den ich einhaken kann?

Und wenn es keine andere Möglichkeit gibt, als das Fragment-Projekt in ein reguläres Plug-in-Projekt zu konvertieren, gibt es dann einen Nachteil, den ich beachten muss?

Dies ist die Lösung, die ich auf der Grundlage der akzeptierten Antwort verwendet habe:

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)
            {
            }
        }
    }
}

6voto

McDowell Punkte 105255

Sie könnten einen Erweiterungspunkt definieren und Ihre Fragmentklassen über Erweiterungen nachschlagen/aufrufen.

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

EDIT :

Um diesen Ansatz zu verwenden, muss ich Folgendes umwandeln meine Fragmente in Plug-in-Projekte Projekte umwandeln. - bmatthews68

Das sollten Sie auch nicht müssen. In meinem Testcode habe ich zum Beispiel die folgenden Dateien im Host-Plugin:

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>

Das Fragment enthält diese Dateien:

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"

fragment.xml :

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

Diese Projekte wurden mit Eclipse 3.3.1.1 erstellt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X