|
||
![]() |
|
![]() |
|
Table of Contents
Plugins et utilisation de librairies tierces— Cyril HUGER, mars 2006 Le développement d’un nouveau plugin se fait rarement sans s’appuyer sur des librairies tierces, mais quelles sont les approches possibles pour intégrer ces fameux JARs externes à notre projet ?
Nous n’aborderons pas la solution triviale qui consiste à intégrer directement le JAR à notre projet. Cette solution n’est adaptée qu’aux plugins de petite taille et sans relations de dépendance avec le reste des plugins. Nous nous placerons plutôt dans le cas d’une contribution plus conséquente basée sur plusieurs plugins. Dans ce scénario il y a de fortes chances que nos différents plugins nécessitent une même librairie tierce partie. Intégrer le JAR externe à chacun de nos plugins est exclu pour des raisons évidentes de taille et de maintenance (chaque plugin serait impacté en cas de mise à jour du JAR externe).
Afin de rendre l’explication plus concrète nous allons supposer que notre contribution est découpé en deux plugins :
Ces deux plugins s’appuient sur la librairie Jakarta Commons Lang en version 2.1. 1) Transformation de la librairie en plugin
Comme souvent avec Eclipse nous n’aurons pas beaucoup à travailler, toutes les étapes sont prises en charge par un assistant. 2) Plugin "repository" de librairies
Tout commence par la création d’un nouveau plugin standard. On déroule l’assistant comme pour tout autre plugin. La seule subtilité est de décocher la case “Generate the Java class that controls the plug-in’s life cycle”. En effet notre plugin ne sera qu’un réservoir de librairies et il n’a pas besoin de gérer son cycle de vie. 2.1) Problème de classloaderSi par exemple nous ajoutons à notre plugin “libs” une librairie externe qui contient des composants SWT alors nous aboutirons à une NoClassDefFoundError à l’exécution. Comment expliquer cela ? Supposons que cette librairie nous fournit un composant basé sur la classe org.eclipse.swt.widgets.Composite. Notre plugin “ui” a une dépendance vers le plugin “libs” ainsi qu’une dépendance vers le plugin “org.eclipse.ui”. La classe Composite est donc visible de notre plugin “ui” et tout compile mais à l’exécution une NoClassDefFoundError surgit indiquant qu’elle ne trouve pas la classe Composite. Cette erreur provient du fait que chaque plugin possède son propre classloader. En effet c’est le classloader du plugin “libs” qui charge le composant SWT externe et qui a besoin de charger aussi la classe Composite. Or le plugin “libs” ne référence pas “org.eclipse.ui” et ne peut donc aboutir. La solution consiste donc à ajouter une dépendance du plugin “libs” vers le plugin “org.eclipse.ui”. 3) Avantages / Inconvénients
Maintenant que nous possédons deux solutions pour un même problème essayons de les départager. 4) Transitivité des dépendances
Notre plugin “ui” dépend du plugin “core” qui dépend du plugin “libs” (peut importe qu’il soit créé selon la méthode 1 ou 2. Malgré ce graphe de dépendances le plugin “ui” ne voit pas les classes contenues dans le plugin “libs”. En effet le plugin “ui” ne voit que les classes exportées par le plugin “core”. Il faut donc que le plugin “ui” décrive explicitement sa dépendance envers le plugin “libs” s’il veut avoir accès aux classes exportées par ce plugin. 5) Conclusion
La façon de bien incorporer des librairies tierces dans une contribution Eclipse est un problème moins trivial qu’il n’y paraît. 6) LiensHow can I share a JAR among various plug-ins?
|
||