2008-12-13 4 views
3

Je construis un plug-in Eclipse qui fournit un ensemble de fonctionnalités de base dans le projet de plug-in standard. Les fonctionnalités optionnelles que je fournis via des projets fragmentés. Mais j'ai besoin des fragments pour s'enregistrer avec le plug-in principal au démarrage.Existe-t-il un équivalent à BundleActivator pour les projets fragment Eclipse?

Je ne peux pas avoir un bundle-activator dans le projet fragment. Je me demande donc s'il existe un autre mécanisme pour déclarer un point d'entrée ou un rappel que je peux utiliser?

Et s'il n'y a pas d'autre alternative que de convertir le projet de fragment en un projet de plug-in standard, y a-t-il un inconvénient que je dois connaître?

C'est la solution que j'utilisée en fonction de la réponse acceptée:

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

Cette question devrait servir d'exemple pour l'utilisation de stackoverflow. Merci! –

Répondre

5

Vous pouvez définir un point d'extension et recherche/appeler vos classes de fragments via des extensions.

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:

Pour utiliser cette approche, je dois convertir mes fragments projets plug-in projets. - bmatthews68

Vous ne devriez pas avoir à. Par exemple, dans mon code de test, je les fichiers suivants dans le plugin hôte:

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> 

Le fragment contient les fichiers suivants:

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> 

Ces projets ont été générés en utilisant Eclipse 3.3.1.1.

+0

Avec votre réponse, j'ai réussi à faire fonctionner cette fonctionnalité dans mon plug-in dès la première tentative. Merci pour l'aide. –

Questions connexes