Eclipse RCP

OSGi et chargement des classes

  • Chaque plug-in a son propre Classloader.
  • Le classloader d'un plug-in peut déléguer, sous conditions, la recherche d'une classe au classloader d'autres plug-ins.
  • L'utilisation d'un classloader par plug-in pose un problème aux librairies qui s'appuient sur la notion de ContextClassLoader.
  • Dans le cas d'Eclipse, le ContextClassloader est celui qui charge startup.jar, il se trouve donc au-dessus des classloaders des plug-ins et ne 'voit' donc pas les classes des plug-ins.

Depuis Eclipse 3.1, une option propre à Eclipse a été introduite dans le fichier MANIFEST.MF: Buddy (copain)

Dans le plug-in qui contient la librairie ou les ressources à partager, spécifier quels sont les plugins qui sont autorisés en ajoutant dans son MANIFEST.MF la ligne suivante:

Bundle-SymbolicName: IDPluginContenantLaLibrairie
Eclipse-BuddyPolicy: registered

Dans les plug-ins utilisant la librairie ou les ressource de l'autre plugin

Eclipse-RegisterBuddy: IDPluginContenantLaLibrairie

Les propriétés suivantes impactent la visibilité des classes:

  • Export-Package liste des packages potentiellement visibles par tous les plug-ins
  • Import-Package liste des packages à importer qui appartiennent à des plug-ins qui ne sont pas dans les dépendances. Ces packages doivent avoir été exportés par leur plug-in.

Eclipse-LazyStart: true / false

  • Eclipse-LazyStart: true Le plugin est automatiquement démarré lorsqu'une classe de ce plugin est chargée.
  • Eclipse-LazyStart: false Le plugin n'est pas activé au démarrage, ni démarré lorsqu'une classe de ce plugin est chargée.

Intégration de librairies existantes

Par injection

New > Project... > Plug-in from existing JARs, cocher la case Unzip the JAR archives into the project

A noter que le premier fichier n'est pas remplacé si un autre fichier existe avec le même nom

Par wrapping

New > Project... > Plug-in from existing JARs, décocher la case Unzip the JAR archives into the project

Lors de l'export, il faut le packager comme répertoire. De tels plugins sont inefficient car les .jar inclus doivent être extraits avant d'être utilisés

Tips 'n' tricks

A) Générer un activator si un plugin nécessite une initialisation particulière la première fois qu'il est accédé

B) Une application est le point d'entrée d'un programme ou d'un produit. L'application est exécutée lorsque le Runtime démarre. Une application peut aussi être utilisée pour des applis non-graphique (par ex. pour lancer un serveur).

C) Ce message d'erreur survient si le plugin n'est pas référencé dans la configuration d'exécution

!ENTRY org.eclipse.osgi 2 0 2007-04-05 13:27:14.081
!MESSAGE One or more bundles are not resolved because the following root constraints are not resolved:
!SUBENTRY 1 org.eclipse.osgi 2 0 2007-04-05 13:27:14.081
!MESSAGE Bundle initial@reference:file:wrkspace/ch.xxx.service/ was not resolved.
!SUBENTRY 2 ch.gma.xxx.service 2 0 2007-04-05 13:27:14.081
!MESSAGE Missing required bundle oracle.jdbc.driver_0.0.0.

Program arguments

-consoleLog //Tous les messages d'erreur sont affichés dans la console

Liens