Improve Foudations Improve Technologies Improve Community Improve Institute

Eclipse Buddy Class Loading

Une petite synthèse de ce qu’il faut savoir / a brief synthesis of what you must know


Principes

Chaque plugin a son propre Class Loader.

Celui-ci peut accéder aux classes du plugin et à celles des packages exportés explicitement dans les plugins dont il dépend.

Problème

Si un plugin doit charger une classe quelconque, d’un plugin dont il ne dépend pas, ça ne fonctionne pas. Ce cas survient pourtant de temps en temps.

Exemple : un plugin encapsulant Log4j veut accéder à une classe d’un plugin P1 qui utilise Log4j, mais la dépendance est déclarée de P1 vers Log4j et pas dans l’autre sens. Déclarer la dépendance dans l’autre sens n’aurait pas de sens justement, car il n’est pas raisonnable d’ajouter au plugin Log4j tous les plugins susceptibles de l’utiliser... Celui-ci doit rester indépendant et ne doit pas être modifié sous prétexte qu’un nouveau plugin l’utilise.

La solution

La solution s’appelle “Buddy class loading”.

Il suffit de déclarer ce mécanisme dans les fichiers MANIFEST.MF :

  • dans le plugin partagé qui a besoin d’accéder aux classes externes (Log4j) :
Eclipse-BuddyPolicy: registered
  • dans les plugins qui utilisent le premier (P1) :
Eclipse-RegisterBuddy: <nom du plugin partagé>

C’est une manière implicite de déclarer la relation dans l’autre sens.


Principles

Each plugin has its own Class Loader.

This one can reach all the plugin classes and those from the packages explicitly exported in the plugins on which it depends.

Problem

If a plugin must load som class from a plugin on which it does not depend, you will get an exception. However it could be useful in some cases.

Example: a plugin encapsulating Log4j wants to access a class from a P1 plugin which uses Log4j, but dependence is declared from P1 towards Log4j and not in the other way. Declaring the dependence in the other way would not have sense, because adding to Log4j a dependance towards every plugin would not be satisfying... Indeed, this one must remain independent and does not have to be modified just because a new plugin needs to use it.

Solution

The solution is called “Buddy class loading”.

You have to declare it in Manifest.MF files :

  • in the shared plugin needing to access external classes (Log4j) :
Eclipse-BuddyPolicy: registered
  • in the other plugins unsing this first one (P1) :
Eclipse-RegisterBuddy: <name of shared plugin>

Thus you implicitly declare a sort of “dependency” in the other way round.

 
moni/trucs/buddy_class_loading.txt · Last modified: 2006/08/22 10:48 by fesnault