Introduction à la conception de plug-ins

6,166 views

Published on

Ce support de cours est une introduction à la conception de plug-ins avec la plateforme Eclipse. Nous étudions les aspects suivants : introduction à OSGi, développement par l'exemple d'un plug-in simple, la description des fichiers MANIFEST.MF, plugin.xml et build.properties et enfin la description des classes Activator et Platform.

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,166
On SlideShare
0
From Embeds
0
Number of Embeds
2,355
Actions
Shares
0
Downloads
261
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Introduction à la conception de plug-ins

  1. 1. Développement de clientsriches : Plateforme Eclipse Chapitre 3 : Conception de plug-ins Introduction à la conception de plug-ins Mickaël BARON - 2008 (Rev. Avril 2009) mailto:baron.mickael@gmail.com ou mailto:baron@ensma.fr
  2. 2. Licence Creative Commons Contrat Paternité Partage des Conditions Initiales à lIdentique 2.0 Francekeulkeul.blogspot.com http://creativecommons.org/licenses/by-sa/2.0/fr Intro. Conc. Plug-in - M. Baron - Page 2
  3. 3. Organisation du cours sur la conception de plug-ins Eclipse OSGi et Eclipse : généralités sur OSGi Tutoriel de conception : création d’un plug-in Fichiers de configuration : paramétrer un plug-in Activator : information sur le plug-inkeulkeul.blogspot.com Platform : information sur l’environnement Tous les exemples du cours sont disponibles directement à l’adresse mbaron.developpez.com/eclipse/introplugin Intro. Conc. Plug-in - M. Baron - Page 3
  4. 4. Conception de plug-in Eclipse : généralités Ce support de cours s’intéresse uniquement aux aspects liés à la conception de plug-ins Eclipse La conception d’applications Eclipse RCP sera vue dans une autre partie de ce chapitre et nous étudierons La classe Application Perpsective, View, Editor Product pour générer une application Eclipse RCP Pour simplifier, la différence entre plug-in et Eclipse RCP est qu’une application Eclipse RCP est une version stand-alone d’un plug-inkeulkeul.blogspot.com A l’inverse, un plug-in ne peut être exécuté seul, il faut lui associer obligatoirement une application Eclipse Un glossaire de tous les acronymes et concepts est proposé à la fin de ce support de cours Intro. Conc. Plug-in - M. Baron - Page 4
  5. 5. Conception de plug-in Eclipse : déroulement du cours Pédagogie du cours Présentation des concepts Illustration avec de nombreux exemples qui sont disponibles à l’adresse mbaron.developpez.com/eclipse/introplugin Des bulles d’aide tout au long du cours Logiciels utilisés Ceci est une astuce Eclipse 3.3 Europa Pré-requis Ceci est une alerte Connaissance de Javakeulkeul.blogspot.com Principes de base concernant la boite à outils SWT Remerciements Developpez.com : Néo Kimz, Jawher Moussa, Baptiste Witch Benjamin Cabé Intro. Conc. Plug-in - M. Baron - Page 5
  6. 6. Introduction à la conception de plug-ins : ressources … Des articles sur le sujet OSGi et Eclipse www.ibm.com/developerworks/library/os-ecl-osgi t-templier.developpez.com/tutoriel/java/osgi/osgi1 www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html?page=1 neilbartlett.name/blog/osgibook Des articles sur une introduction à la conception de plug-ins www.eclipsetotale.com/articles/Developpement_de_plugins_Eclipse_partie1.html wiki.improve.fr/wiki/moni/articles/thirdpartylib www.ibm.com/developerworks/library/os-eclipse-plugindev1keulkeul.blogspot.com Des livres Eclipse – Building Commercial-Quality Plug-ins, 2004 - ISBN : 0-321-22847-2 Eclipse – Rich Client Platform, 2005 – ISBN : 0-321-33461-2 Intro. Conc. Plug-in - M. Baron - Page 6
  7. 7. OSGi : Open Service Gateway Initiative La plateforme Eclipse repose en partie sur la spécification OSGi qui est l’acronyme de Open Service Gateway Initiative La spécification peut être trouvée à l’adresse suivante www.osgi.org/Specifications/HomePage Pour synthétiser, la spécification OSGi tente d’adresser deux types de problématiqueskeulkeul.blogspot.com Programmation orientée composant Architecture orientée service (composants exposent et importent des services) Intro. Conc. Plug-in - M. Baron - Page 7
  8. 8. OSGi : Open Service Gateway Initiative Dans l’architecture OSGi le concept de composant est mis en œuvre par l’intermédiaire de Bundles Gestion des bundles (module) Gestion des différents chargeurs de classes Gestion des versions des dépendances Un chargeur de classes par bundle Cycle de vie des bundles (life cycle)keulkeul.blogspot.com Cycle de vie du composant lors de son entrée dans le conteneur OSGi Cycle de vie du composant lors de son utilisation Services exposés par les bundles (service) Gestion des services définis dans des interfaces Plug-in - M. Baron - Page Intro. Conc. Java 8
  9. 9. OSGi : Open Service Gateway Initiative Différentes implémentations de la spécification OSGi OSCAR : oscar.objectweb.org Felix : felix.apache.org KnopflerFish 2 : www.knopflerflish.org Eclipse (celle que nous allons étudier) Pour une vue d’ensemble de toutes les implémentationskeulkeul.blogspot.com OSGi : www.osgi.org/Markets/HomePage Intro. Conc. Plug-in - M. Baron - Page 9
  10. 10. OSGi : Open Service Gateway Initiative Un bundle est décrit dans un fichier Jar Les informations de déploiement sont indiquées dans le fichier MANIFEST.MF (informations spécifiques à OSGi) Interactions entre Bundles Mise à disposition de packages (préciser dans MANIFEST.MF quels sont les packages à exporter)keulkeul.blogspot.com Importation de packages (quels sont les packages issus d’autres bundles à utiliser) Intro. Conc. Plug-in - M. Baron - Page 10
  11. 11. OSGi et Eclipse Dans l’implémentation fournie par Eclipse, un bundle corres- pond à un plug-in Eclipse a adopté la spécification OSGi depuis la version 3.0 Eclipse ne repose pas complètement sur la spécification OSGi pour effectuer l’interaction entre les plug-ins La notion de registres d’extension qui existe depuis le début de la plateforme permet également de communiquer entre plug-inskeulkeul.blogspot.com Dans la suite du cours nous montrons comment les registres d’extension et les services OSGi sont utilisés Une comparaison peut être trouvée à l’adresse suivante www.eclipsezone.com/articles/extensions-vs-services/ M. Baron - Page Intro. Conc. Plug-in - 11
  12. 12. Conception du plug-in « plug-hype » Nous décrivons dans cette partie la conception d’un plug-in via l’environnement Eclipse La démarche est de présenter chaque écran de l’assistant fourni avec Eclipse pour construire ce plug-in Nous survolerons également les fichiers générés sachant qu’ils seront tous détaillés tout au long de ce chapitre Nous montrerons également les différentes possibilités offertes par la plateforme Eclipse pour tester ce plug-in Le plug-in présenté a comme objectif d’afficher une vuekeulkeul.blogspot.com contenant un TableViewer et un label qui affiche « Ceci est un plug-hype ! » Pré-requis : un environnement Eclipse avec le module PDE installé (Plugin Development Environment)Plug-in - M. Baron - Page 12 Intro. Conc.
  13. 13. Tutoriel « plug-hype » : Select a wizard Sélectionner à partir du menu Eclipse l’action File -> New -> Project pour ouvrir l’assistant de création de projet Sélectionner l’assistant de création de projet Le groupe « Plug-in de plug-in Development » fournit un ensemble d’assistants lié à la conception de plug-inkeulkeul.blogspot.com Rien n’interdit le développement de plug-in « à la mano », cependant ça peut être fastidieux … Intro. Conc. Plug-in - M. Baron - Page 13
  14. 14. Tutoriel « plug-hype » : Plug-in Project Saisir un nom de projet lié au plug-in à créer Possibilité de modifier l’emplacement des Choisir le nom des fichiers du plug-in répertoires sources (par défaut celui du et binaires workspace courant) Choix de la plateforme cible …keulkeul.blogspot.com Soit le développement d’un Soit le développement bundle OSGi (en choisissant le d’un plug-in Eclipse type d’implémentation OSGi) (en choisissant la version de la distribution) Intro. Conc. Plug-in - M. Baron - Page 14
  15. 15. Tutoriel « plug-hype » : Plug-in Content Cette page permet de paramétrer le plug-in en cours de développement Définition d’un ID qui permettra d’identifier ce plug-in parmi les autres Précise le numéro Nom du plug-in de version qui pourra être utilisé Nom de fournisseur pour le versioning lors d’une mise à jour Précise si un Activator doit être généré ou paskeulkeul.blogspot.com Nom de l’Activator Précise si le plug-in Précise si le plug-in propose ou pas une est autonome ou pas IHM Intro. Conc. Plug-in - M. Baron - Page 15
  16. 16. Tutoriel « plug-hype » : Select Template Des templates de génération sont disponibles selon les options fournies précédemment Utiliser ou pas les templates de création Cette option permet de sélectionnerplusieurs templates de génération Une aide contextuelle qui fournie des informations sur lekeulkeul.blogspot.com template et les Des templates extensions utilisées spécifiques qui embarquent des IHM Intro. Conc. Plug-in - M. Baron - Page 16
  17. 17. Tutoriel « plug-hype » : Plug-in options Selon le type de plug-in des options supplémentaires sont à renseigner Le nom de la classe pour la vue à créer Le nom de la vue L’ID de la catégorie qui servira dekeulkeul.blogspot.com Le nom de la regroupement pour catégorie qui servira cette vue de regroupement Intro. Conc. Plug-in - M. Baron - Page 17
  18. 18. Tutoriel « plug-hype » : Plug-in options Différentes options liées à la vue peuvent être précisées Ajout du support du double clique sur la vuekeulkeul.blogspot.com Ajout du support du tri dans le composant TableViewer Intro. Conc. Plug-in - M. Baron - Page 18
  19. 19. Tutoriel « plug-hype » : vue rapide sur PDE L’outil PDE (Plugin Development Environment) fournit entre autre une vue pour configurer les plug-ins Certaines informations saisies Nous détaillerons lors de l’assistant sont chaque écran lors disponibles en édition de la partie fichiers de configuration La vue du PDEkeulkeul.blogspot.com structure les informations à manipuler par onglet Toutes les modifications apportées dans la vue impactent les fichiers de configuration et vice et versaIntro. Conc. Plug-in - M. Baron - Page 19
  20. 20. Tutoriel « plug-hype » : répertoires et fichiers générés Un plug-in contient un ensemble de fichiers qui sont positionnés suivant une logique commune PlugHype.java La classe qui définit la vue Activator.java du plug-in Classe qui gère le cycle de vie du plug-in MANIFEST.MF Informations générales et dépendances entre plug-inkeulkeul.blogspot.com build.properties Informations liées au plugin.xml déploiement du plug-in Informations liées aux extensions et aux points d’extension Intro. Conc. Plug-in - M. Baron - Page 20
  21. 21. Tutoriel « plug-hype » : exécuter dans Eclipse Un plug-in peut être vu comme une brique d’une application et ne peut fonctionner seul Pour tester un plug-in, il faut l’associer à une application de type Eclipse Une application Eclipse est un regroupement de plug-ins dont le nombre varie selon les fonctionnalités désirées Dans notre exemple, le plug-in a tester fournit simplement une vue dont les dépendances avec les autres plug-ins sontkeulkeul.blogspot.com limités De manière générale pour tester nos plug-ins nous utiliserons une application Eclipse basée sur une version minimale de l’IDE d’Eclipse (voir transparents Plug-in - M. Baron - Page Intro. Conc. suivants) 21
  22. 22. Tutoriel « plug-hype » : exécuter dans Eclipse Sélectionner à partir du menu Eclipse l’action Run -> Open Run Dialog … Ou à partir de la barre d’actionskeulkeul.blogspot.com Intro. Conc. Plug-in - M. Baron - Page 22
  23. 23. Tutoriel « plug-hype » : exécuter dans Eclipse Cette page fournit un gestionnaire de configurations pour des applications Eclipse Création d’une nouvelle configuration d’une application Eclipse Liste des différenteskeulkeul.blogspot.com configurations d’exécution Intro. Conc. Plug-in - M. Baron - Page 23
  24. 24. Tutoriel « plug-hype » : exécuter dans Eclipse Cet onglet fournit des indications sur l’application Eclipse à exécuter Le répertoire Workspace indique où seront stockés les fichiers liés au contexte d’exécution L’option « Clear » permet d’effectuer un nettoyage au niveau du Workspace Choix de l’application à exécuter pour tester le plug-in « plug-hype ». Dans notre cas il s’agit d’une version allégéekeulkeul.blogspot.com de l’IDE Eclipse L’option Run an application sera choisie quand nous développerons des applications Eclipse RCP Intro. Conc. Plug-in - M. Baron - Page 24
  25. 25. Tutoriel « plug-hype » : exécuter dans Eclipse Cet onglet fournit des indications sur les plug-ins qui seront utilisés lors de l’exécution de l’application Eclipse Ce nœud fournit tous les plug-ins du Tous les workspace plug-ins peuvent être ajoutés Le plug-in automatiquement « plug-hype » est via l’action Add ajouté dans Required Plug-ins l’application Eclipse Ce nœud contient tous les plug-ins de la plateforme Eclipse (ceux installés dans lekeulkeul.blogspot.com répertoire plugins) Il ne reste plus Seuls les plug-ins qu’à lancer « vitaux » de la l’exécution version allégée de l’IDE d’Eclipse doivent être ajoutés Intro. Conc. Plug-in - M. Baron - Page 25
  26. 26. Tutoriel « plug-hype » : exécuter dans Eclipse Cet onglet autorise l’enregistrement du fichier de configura- tion d’exécution Sélectionner l’option Choisir un « Shared file » répertoire où sauvegarder le fichier de configuration d’exécution Après validation un fichier de configuration d’exécution est créékeulkeul.blogspot.com Intro. Conc. Plug-in - M. Baron - Page 26
  27. 27. Tutoriel « plug-hype » : exécuter dans Eclipse Fichier de configuration d’exécution contenant toutes les informations pour exécuter une application Eclipse Informations relatives à la configuration d’exécutionkeulkeul.blogspot.com Si un fichier de configuration d’exécution est présent, la configuration est automatiquement présentée dans le gestionnaire de configuration Intro. Conc. Plug-in - M. Baron - Page 27
  28. 28. Tutoriel « plug-hype » : exécuter dans Eclipse L’ouverture de la fenêtre qui regroupe toutes les vues est Version allégée de l’IDE obtenue par l’action Window -> d’Eclipse Show View -> Other … Cette vue est fournie par le plug-in Plug-Hype Le regroupement Samplekeulkeul.blogspot.com Category contient la vue Plug-Hype Possibilité d’ajouter une vue dans un regroupement déjà existant Intro. Conc. Plug-in - M. Baron - Page 28
  29. 29. Structure d’un plug-in : généralités Dans la suite de cette partie, nous présentons la syntaxe des fichiers de configuration d’un plug-in L’objectif est d’en ressortir les principales options utilisées par un plug-in Cette présentation sera réalisée sur la base des fichiers de configuration et des interfaces associées fournies par PDE Trois fichiers de configuration MANISFEST.MF : informations générales concernant le fonction-keulkeul.blogspot.com nement d’un plug-in et les différentes dépendances entre plug-ins plugin.xml : informations liées aux extensions et points d’extension utilisés et fournis par un plug-in build.properties : informations liées au déploiement M. Baron - Page Intro. Conc. Plug-in - du plug-in 29
  30. 30. Structure d’un plug-in : répertoires et fichiers Un plug-in possède une hiérarchie de répertoires et de fichiers build.properties Informations liées au déploiement plugin.xml Informations liées aux extensions et points d’extension utilisées par ce plug-in src Sources Java du plug-in Plug-in bin Byte codes du plug-in Racine d’un Icônes et images icons plug-in exploitées par le plug-in META-INF MANIFEST.MF Les informations générales d’unkeulkeul.blogspot.com plug-in et ses dépendances avec les autres plug-ins lib *.jar Des bibliothèques dans des archives Jar Autres fichiers supplémentaires Intro. Conc. Plug-in - M. Baron - Page 30
  31. 31. Structure d’un plug-in : MANIFEST.MF Le fichier de configuration MANIFEST.MF décrit le fonction- nement d’un plug-in dont la spécification est fournie en partie par OSGi informations générales (nom, auteur, version, …) informations de dépendances avec les autres plug-ins Ce fichier existe depuis longtemps dans le monde Java pour décrire une archive Jar Il est possible de mixer les informations liées à l’archive Jar avec les informations liées au plug-in sous la condition que ces dernières soient placées en seconde positionkeulkeul.blogspot.com Nous présentons dans la suite les principales entrées utiles pour le développeur de plug-in Eclipse Une description détaillée de toutes les entrées est disponible dans la spécification OSGi framework core - M. Baron - Page 31 Intro. Conc. Plug-in
  32. 32. Structure d’un plug-in : MANIFEST.MF Généralement l’édition se fait par les vues fournies par PDE. Toutefois Partie spécifique certaines options ne sont pas à l’archive Jar éditables via les vues PDE Des entrées définies par la spécification OSGi Partie spécifique auxkeulkeul.blogspot.com informations du plug-in MANIFEST.MF du projet plughype Si vous éditez directement le fichier MANIFEST.MF, ne laissez pas de ligne vide entre les options et laissez toujours une ligne vide à la fin Intro. Conc. Plug-in - M. Baron - Page 32
  33. 33. MANIFEST.MF : informations générales Bundle-ManifestVersion : précise la spécification que doit suivre ce plug-in (ex : 2 pour la version 4 d’OSGi) Bundle-Name : nom du plug-in désignant l’objectif du plug-in (ex : Plughype Plug-in) Bundle-Vendor : nom de l’organisme ou auteur qui a développé le plug-in (ex : Mickael BARON) Bundle-Description : description rapide de l’objectif de ce plug-in (ex : ce plug-in décrit une vue qui affiche …)keulkeul.blogspot.com Bundle-Copyright : copyright de ce plug-in Bundle-RequiredExecutionEnvironment : liste des environnement d’exécution (J2SE 1.3 par exemple) obliga- toires pour utiliser ce plug-in (ex : JavaSE-1.6) - M. Baron - Page Intro. Conc. Plug-in 33
  34. 34. MANIFEST.MF : informations générales Bundle-SymbolicName : identifiant unique pouvant être suivi de l’option singleton (booléen) singleton : si true une seule version de ce plug-in est réalisée, si false plusieurs versions Ex : Bundle-SymbolicName: eclipse.plugin.plughype; singleton:=true Bundle-Activator : nom de la classe utilisée pour démarrer et arrêter le plug-in (ex : eclipse.plugin.plughype.Activator) Bundle-Version : précise la version du plug-in construite à partir de trois numériques (major.minor.micro) et optionnel-keulkeul.blogspot.com lement une chaîne pour la qualification (ex : 1.0.0.build=34) Eclipse-PlatformFilter : propre à Eclipse, information permettant de contraindre l’utilisation d’un plug-in au niveau d’une plateforme cible (Windows, MAC OS X ou Linux) Intro. Conc. Plug-in - M. Baron - Page 34
  35. 35. MANIFEST.MF : informations générales Vue du PDE relatif aux informations générales d’un plug-in Bundle-Version Bundle-SymbolicName Bundle-Vendor Bundle-Name Bundle-Activator Eclipse-PlatformFilter (information détaillée dans la partie Fragment & Feature)keulkeul.blogspot.com Informations générales Bundle-RequiredExecutationEnvironment placées dans l’onglet Overview Intro. Conc. Plug-in - M. Baron - Page 35
  36. 36. MANIFEST.MF : informations générales Certaines informations d’un plug-in sont utilisées au niveau de la vue qui affiche la liste complète des plug-ins Boîte à propos accessible à partir de l’action About Eclipse SDKkeulkeul.blogspot.com Affiche quelques informations générales des plug-ins installées Intro. Conc. Plug-in - M. Baron - Page 36
  37. 37. MANIFEST.MF : informations de dépendance Une application Eclipse est composée d’un ensemble de plug-ins où chaque plug-in peut exploiter des classes fournies par d’autres plug-ins Inversement un plug-in peut fournir des classes que d’autres plug-ins pourront exploiter Le développement d’une application Eclipse est par conséquent modulaire Un plug-in est réutilisablekeulkeul.blogspot.com Le développement d’un plug-in est unitaire Nous présentons dans la suite les dépendances entre plug-in via deux plug-ins Intro. Conc. Plug-in - M. Baron - Page 37
  38. 38. MANIFEST.MF : informations de dépendance L’exemple présenté dans la suite est basé sur deux plug-ins dont l’objectif est de sauvegarder et charger le contenu d’un formulaire Le plug-in DependenciesExample fournit une vue avec deux champs de texte Le plug-in ExportExample fournit un modèle de la vue et exploite la librairie XStream pour sérialiser/désérialiser le contenu du modèlekeulkeul.blogspot.com Le plug-in ExportExample expose le package contenant les classes servant à communiquer avec le modèle de la vue Le plug-in DependenciesExample à une relation de dépendance avec ExportExample Intro. Conc. Plug-in - M. Baron - Page 38
  39. 39. MANIFEST.MF : informations de dépendance Formalismes graphiques employés pour modéliser les inter- connexions entre plug-ins Le nom du plug-in Les packages, ou de Les packages, ou de manière plus fine les manière plus fine les méthodes exportées méthodes utilisées par par ce plug-in ce plug-in Nom du Plug-in Package Imp 1 Package Exp 1 lib.jar Package Imp 2 Singleton = true, … Package Exp 2 Point 2 Point 1 Ext 2 Ext 1 Différentes options utiles à Les extensions la compréhension dukeulkeul.blogspot.com associées à un autre fonctionnement du plug-in plug-in Les points d’extension Les extensions et les points fournis par le plug-in d’extension seront détaillés dans la prochaine partie de ce chapitre Intro. Conc. Plug-in - M. Baron - Page 39
  40. 40. MANIFEST.MF : informations de dépendance Package à exporter Schéma de dépendances de l’exemple ExportExample Le plug-in Le plug-in eclipse.plugin.exportexample DependenciesExample xstream.jar ExportExample dépend de trois plug-ins met à disposition un package contenant deux classes DependenciesExample org.eclipse.core.runtime … Perspective ext. Le plug-in Le plug-in core.runtime est le DependenciesExample … … est associé à deux points views plug-in indispensable lors de toute création d’extension fournis par lekeulkeul.blogspot.com de nouveau plug-in org.eclipse.ui plug-in org.eclipse.ui … … … … De nombreuses dépendances vers des plug-ins « bas niveaux » Intro. Conc. Plug-in - M. Baron - Page 40
  41. 41. MANIFEST.MF : informations de dépendance Un plug-in doit inclure d’autres plug-ins à partir du moment les packages exportés par les autres plug-ins sont utilisés par ce plug-in le plug-in définit des extensions à partir de points d’extension fournis par les autres plug-ins Require-Bundle: liste des plug-ins à inclure. Les plug-ins sont identifiés par leur nom symbolique (valeur définie par la clé Bundle-SymbolicName) MANIFEST.MF du projet DependenciesExamplekeulkeul.blogspot.com Exemple Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, eclipse.plugin.ExportExample Trois plug-ins sont requis pour les opérations du plug-in DependenciesExample Intro. Conc. Plug-in - M. Baron - Page 41
  42. 42. MANIFEST.MF : informations de dépendance L’information Require-Bundle propose différentes options visibility si valeur private (par défaut), tous les packages exportés par le plug-in requis ne sont visibles qu’au niveau du plug-in qui effectue la dépendance si valeur reexport, tous les packages exportés par le plug-in requis sont diffusés à tous les niveaux supérieurs Exemple : si le plug-in A requiert le plug-in B, et que le plug-in B requiert le plug-in C dont la visibilité est reexport, alors le plug-in A aura accès au contenu de C comme si A avait requis le plug-in Ckeulkeul.blogspot.com resolution si valeur mandatory (par défaut), le plug-in requis doit exister si valeur optional, le plug-in requis n’est pas utile au fonctionnement du plug-in qui demande la dépendanceIntro. Conc. Plug-in - M. Baron - Page 42
  43. 43. MANIFEST.MF : informations de dépendance bundle-version Cette option facultative permet de restreindre la dépendance d’un plug-in en fonction de son numéro de version La restriction peut s’effectuer soit par un numéro de version exacte soit par un intervalle entre une version minimum et maximum Syntaxe pour la définition d’un écart de version [min, max) : où min correspond à la version minimum et max la version maximum [ = min est inclue dans l’écart, ( = min n’est pas inclue dans l’écart ] = max est inclue dans l’écart, ( = max n’est pas inclue dans l’écartkeulkeul.blogspot.com Exemples [3.0.0, 3.1.0) nécessite un plug-in estampillé 3.0.x [3.3.0, 4.0.0) nécessite un plug-in estampillé 3.3.x 3.3.0 nécessite un plug-in estampillé 3.3.0 Conc. Plug-in - M. Baron - Page Intro. 43
  44. 44. MANIFEST.MF : informations de dépendance Ajouter une dépendance vers un plug-in Supprimer une dépendance vers un plug-in déjà requis Définition des contraintes (visibility, resolution et bundle-version) Liste des plug-ins requis Propriétés concernant lakeulkeul.blogspot.com dépendance MANIFEST.MF du projet Dépendances placées dans DependenciesExample l’onglet Dependencies Intro. Conc. Plug-in - M. Baron - Page 44
  45. 45. MANIFEST.MF : informations d’exportation Export-Package : liste l’ensemble de packages qui seront exportés par ce plug-in Les packages peuvent contenir les classes qui seront par conséquent implicitement exportés Les sous packages ne sont pas exportés, il faut selon les besoins les ajouter dans la liste des packages à exporter Les principales options disponibles x-friends : spécifie les plug-ins autorisés à importer un package donnékeulkeul.blogspot.com MANIFEST.MF du projet ExportExample Exemple Export-Package: eclipse.plugin.exportexample; x-friends:=eclipse.plugin.DependenciesExample Le package exportexample est exporté et seul le plug-in DependenciesExample peut l’importer Intro. Conc. Plug-in - M. Baron - Page 45
  46. 46. MANIFEST.MF : informations d’exportation Possibilité de choisir les plug-ins autorisés à utiliser le package exporté Le package eclipse.plugin.exportexample est exporté Le plug-in DependenciesExample est le seul plug-in à utiliser le package exportexamplekeulkeul.blogspot.com Exportation de packages placée dans l’onglet Runtime Intro. Conc. Plug-in - M. Baron - Page 46
  47. 47. MANIFEST.MF : exemple (dépendance + exportation) Exemple : plug-in ExportExample MANIFEST.MF du projet ExportExample Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: ExportExample Plug-in Bundle-SymbolicName: eclipse.plugin.ExportExample Bundle-Version: 1.0.0 Bundle-Activator: eclipse.plugin.exportexample.Activator Bundle-Vendor: Mickael BARON Require-Bundle: org.eclipse.core.runtime Eclipse-LazyStart: true Export-Package: eclipse.plugin.exportexample;version=1.0.0; L’arborescence des x-friends:=eclipse.plugin.DependenciesExample fichiers et répertoires Bundle-ClassPath: lib/xstream-1.3.jar, . du plug-inkeulkeul.blogspot.com ExportExample Seul le package eclipse.plugin.exportexample est public Intro. Conc. Plug-in - M. Baron - Page 47
  48. 48. MANIFEST.MF : exemple (dépendance + exportation) Exemple (suite) : plug-in ExportExample package eclipse.plugin.exportexample; public interface ISerializeName { String getName(); Cette interface fournit void setName(String pName); les services exposés String getDescription(); par le plug-in void setDescription(String pDescription); void loadFromXML() throws FileNotFoundException; void saveFromXML() throws FileNotFoundException; } ISerializeName.java du projet ExportExample Activator.java du projet ExportExample L’objet Activatorkeulkeul.blogspot.com package eclipse.plugin.exportexample; fournit une gestion du public class Activator extends Plugin { cycle de vie du plug-in ... public ISerializeName getSerializeInstance() { Une méthode sert à créer une return new SerializeName(); instance de ISerializeName ce qui } } permet de cacher l’implémentation Intro. Conc. Plug-in - M. Baron - Page 48
  49. 49. MANIFEST.MF : exemple (dépendance + exportation) Exemple (suite) : plug-in ExportExample package eclipse.plugin.exportexample.internal public class SerializeName implements ISerializeName { private String name = ; private String description = ; L’implémentation n’est pas public public String getName() { return name; } public void saveFromXML() throws FileNotFoundException { XStream xstream = new XStream(new DomDriver()); FileOutputStream out = new FileOutputStream(serial.xml); xstream.toXML(this, out); } public void loadFromXML() throws FileNotFoundException { XStream xstream = new XStream(new DomDriver()); FileInputStream in = new FileInputStream(serial.xml); SerializeName temp = (SerializeName)xstream.fromXML(in); La bibliothèque XStream this.setName(temp.getName()); permet de sérialiser et dé- this.setDescription(temp.getDescription()); sérialiser le contenu de cetkeulkeul.blogspot.com } public void setName(String pName) { objet this.name = pName; } public String getDescription() { return description; } SerializeName.java du public void setDescription(String pDescription) { this.description = pDescription; projet ExportExample } } Intro. Conc. Plug-in - M. Baron - Page 49
  50. 50. MANIFEST.MF : exemple (dépendance + exportation) Exemple : plug-in DependenciesExample Un champ pour la saisie de Un champ pour la saisie du la description Nom L’action Sauvegarde appelle le service saveFromXML() du plug-in ExportExamplekeulkeul.blogspot.com L’action Chargement appelle le service DependenciesView.java du projet loadFromXML() du DependenciesExample plug-in ExportExample Intro. Conc. Plug-in - M. Baron - Page 50
  51. 51. MANIFEST.MF : exemple (dépendance + exportation) Exemple (suite) : plug-in DependenciesExample public class DependenciesView extends ViewPart { private ISerializeName currentSerializeFactory; Classe ViewPart permet de public DependenciesView() { définir une vue par extension currentSerializeFactory = Activator.getDefault().getSerializeInstance(); } public void createPartControl(Composite parent) { ... myLoadAction.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { try { Accès à l’instance ISerializeName currentSerializeFactory.loadFromXML(); } catch (FileNotFoundException e1) { par l’intermédiaire de la factory e1.printStackTrace(); fournie par le plug-in } ExportExample myNameText.setText(currentSerializeFactory.getName()); myFillText.setText(currentSerializeFactory.getDescription()); } }); mySaveAction.addSelectionListener(new SelectionAdapter() {keulkeul.blogspot.com public void widgetSelected(SelectionEvent e) { ... } }); } public void setFocus() { DependenciesView.java du projet } } DependenciesExample Intro. Conc. Plug-in - M. Baron - Page 51
  52. 52. MANIFEST.MF : exemple (dépendance + exportation) Exemple (suite) : plug-in DependenciesExample MANIFEST.MF du projet DependenciesExamplekeulkeul.blogspot.com Le plug-in ExportExample est ajouté dans les dépendances de manière à intégrer la partie modèle dans l’IHM Intro. Conc. Plug-in - M. Baron - Page 52
  53. 53. Dépendance vers une bibliothèque Certains plug-ins peuvent avoir besoin de s’appuyer sur des bibliothèques tierces Plusieurs approches sont à envisager 1. Intégration de la bibliothèque dans le plug-in qui l’utilise 2. Transformation du JAR externe en plug-in qui deviendra ainsi un containeur d’un plug-in 3. Création d’un plug-in qui regrouperait toutes les librairies tierces et qui deviendra ainsi un repository de bibliothèques tierces Le choix de telle ou telle approche dépend de la fréquencekeulkeul.blogspot.com d’utilisation de la bibliothèque Nous présenterons chacune de ces approches via notre exemple et la bibliothèque XStream Intro. Conc. Plug-in - M. Baron - Page 53
  54. 54. Intégration d’une librairie dans un plug-in Cette première approche permet d’intégrer les fichiers JAR des bibliothèques directement dans le plug-in qui les utilise L’avantage de cette approche est de simplifier l’intégration d’une bibliothèque En contrepartie, si la bibliothèque est utilisée dans plusieurs plug-ins, il faudra dupliquer l’archive de la bibliothèque Le mode opérateur à réaliser est le suivant création d’un répertoire lib à la racine du plug-in copie des fichiers JAR dans le répertoire libkeulkeul.blogspot.com déclarer les fichiers JAR dans le classpath du plug-in L’entrée Bundle-ClassPath du fichier MANIFEST.MF est utilisée pour renseigner toutes les librairies à ajouter dans le classpath Intro. Conc. Plug-in - M. Baron - Page 54
  55. 55. Intégration d’une librairie dans un plug-in Ajout de la bibliothèque La bibliothèque est XStream dans le classpath automatiquement ajoutée du plug-in dans les propriétés du projet L’entrée Bundle-ClassPath contient toutes les librairies à ajouter dans lekeulkeul.blogspot.com classpath du plug-in ExportExample MANIFEST.MF du projet N’oubliez de renseigner le répertoire courant ExportExample « . » dans l’entrée Bundle-ClassPath Intro. Conc. Plug-in - M. Baron - Page 55
  56. 56. Transformation d’une librairie en plug-in La deuxième approche consiste à placer dans un plug-in la librairie et d’exporter les packages nécessaires L’avantage est de considérer la librairie comme un plug-in et par conséquent si un plug-in a besoin d’utiliser la librairie, il dépendra directement du plug-in contenant la librairie En contrepartie, il peut être plus fastidieux de mettre à jour le contenu du plug-in « librairie » quand une nouvelle version de la librairie est disponible L’environnement de développement Eclipse fournit un Wizard permettant d’automatiser la transformation de lakeulkeul.blogspot.com librairie en plug-in Le mode opérateur à réaliser est le suivant Utiliser l’assistant de transformation Ajouter la dépendance vers le plug-in librairie Plug-in - M. Baron - Page Intro. Conc. 56
  57. 57. Transformation d’une librairie en plug-in Sélectionner à partir du menu Eclipse l’action File - New - Other pour ouvrir la liste des assistants Choisissez l’assistant Plug-in from existing JAR archiveskeulkeul.blogspot.com Intro. Conc. Plug-in - M. Baron - Page 57
  58. 58. Transformation d’une librairie en plug-in Sélectionner les archives JAR à inclure dans le plug-in Utiliser le bouton Add … pour ajouter une archive JAR déjà incluse dans un plug-in Utiliser le bouton Add External … pour ajouter une archive JAR à partir d’un chemin physiquekeulkeul.blogspot.com Intro. Conc. Plug-in - M. Baron - Page 58
  59. 59. Transformation d’une librairie en plug-in Saisir les informations pour créer le plug-in librairie Le nom du plug-in correspond généralement au package utilisé par la bibliothèquekeulkeul.blogspot.com En cochant cette option, les fichiers seront de la librairie sont extrait de l’archive JAR Intro. Conc. Plug-in - M. Baron - Page 59
  60. 60. Transformation d’une librairie en plug-in Les packages de la librairie sont exportés automatiquement Tous les packages de la librairie sont automatiquement exportés, possibilité d’intervenir manuellement pour en cacher certainskeulkeul.blogspot.com MANIFEST.MF du projet com.thoughworks.xstream Intro. Conc. Plug-in - M. Baron - Page 60
  61. 61. Transformation d’une librairie en plug-in Au moment de l’exécution de l’action de désérialisation, un exception est lancée La classe SerializeName est introuvablekeulkeul.blogspot.com Intro. Conc. Plug-in - M. Baron - Page 61
  62. 62. Transformation d’une librairie en plug-in La librairie XStream a besoin de connaître le classpath de la classe à désérialiser située dans le plug-in ExportExample Le plug-in ExportExample a déjà une dépendance vers le plug-in librairie XStream Eclipse ne recommande pas les dépendances cycliques via le mécanisme présenté précédemment Considérons pour la suite deux plug-ins A et B Si A a un dépendance vers B, B ne peut avoir de dépendance vers Akeulkeul.blogspot.com Toutefois B a besoin d’accéder aux ressources (classes, images) de A Eclipse fournit un autre mécanisme permettant d’expliciter cette dépendance en ajoutant des informations spécifiques à la politique du classloading Intro. Conc. Plug-in - M. Baron - Page 62
  63. 63. Transformation d’une librairie en plug-in Les informations à ajouter ne peuvent être réalisées via l’outil PDE, elles doivent être éditées directement dans le fichier MANIFEST.MF Dans le MANIFEST.MF du plug-in A préciser que le plug-in B souhaite accéder à ces ressources Eclipse-RegisterBuddy: eclipse.plugin.B Où eclipse.plugin.B désigne l’ID du plug-in B Dans le MANIFEST.MF du plug-in B préciser la politique du classloading Eclipse-BuddyPolicy: registredkeulkeul.blogspot.com Dans le cas des plug-ins librairies, penser à ajouter systéma- tiquement la politique du classloading à registred A noter que le plug-in B a connaissance de tous les packages du plug-in A et pas uniquement ceux exportés - M. Baron - Page 63 Intro. Conc. Plug-in
  64. 64. Transformation d’une librairie en plug-in Modification de la politique de chargement du classloading MANIFEST.MF du projet du plug-in XStream com.thoughworks.xstream MANIFEST.MF du projet ExportExample Précise que le plug-in xstreamkeulkeul.blogspot.com souhaite accéder aux ressources du plug-in ExportExample Précise que le plug-in xstream peut avoir accés à différents classpath que le sien Intro. Conc. Plug-in - M. Baron - Page 64
  65. 65. Plug-in repository de librairies La troisième approche consiste à intégrer dans un même plug-in toutes les librairies à utiliser Cela consiste à utiliser la deuxième approche est de multiplier le nombre de librairies à ajouter Toutes les librairies seront extraites des archives JAR Tous les packages seront automatiquement exportés par le plug-in Cette approche est à utiliser quand les librairies ont des intérêts communs et des fonctionnalités équivalentskeulkeul.blogspot.com Essayer de regrouper logiquement les librairies quittes à créer plusieurs plug-in repository Une solution est proposée par le projet Orbit qui permet d’automatiser la gestion des librairies www.eclipsecon/orbit Intro. Conc. Plug-in - M. Baron - Page 65
  66. 66. Structure d’un plug-in : plugin.xml Le fichier plugin.xml permet la description des extensions et des points d’extension d’un plug-in Un point d’extension décrit un contrat qui stipule la manière dont des interfaces et des classes d’un plug-in doivent être utilisées par d’autres plug-ins Le contrat est décrit au travers d’un schéma XML Nom du Plug-in … …keulkeul.blogspot.com … … Point 2 Point 1 Ext 2 Ext 1 Les points d’extension Les extensions associées à fournis par le plug-in un autre plug-in Intro. Conc. Plug-in - M. Baron - Page 66
  67. 67. Structure d’un plug-in : plugin.xml L’extension est la réponse apportée à un point d’extension Pour tout point d’extension exploité par un plug-in une extension est obligatoirement réalisée L’extension devra par conséquent respecter le schéma imposé par le point d’extension La notion de registres d’extension est donc un autre moyen pour communiquer entre plug-ins Extension quikeulkeul.blogspot.com respecte le schéma du point d’extension La partie suivante présentera en détail la notion de points d’extension et d’extension Point d’extension défini par un plug-in Intro. Conc. Plug-in - M. Baron - Page 67
  68. 68. Structure d’un plug-in : plugin.xml Création des extensions via l’outil PDE Un extension est réalisée via le point d’extension org.eclipse.ui.views Des informations sont à renseignerkeulkeul.blogspot.com pour respecter le contrat fourni par le point d’extension plugin.xml du projet DependenciesExample Création des extensions via l’onglet Extensions Intro. Conc. Plug-in - M. Baron - Page 68
  69. 69. Structure d’un plug-in : plugin.xml Création des extensions directement via le fichier plugin.xml Chaque extension doit respect le schéma imposé par le point d’extensionkeulkeul.blogspot.com plugin.xml du projet DependenciesExample Edition du fichier plugin.xml via l’onglet plugin.xml Intro. Conc. Plug-in - M. Baron - Page 69
  70. 70. Structure d’un plug-in : plugin.xml Création des points d’extension via l’outil PDE Ce plug-in ne fournit pas de point d’extension plugin.xml du projetkeulkeul.blogspot.com DependenciesExample Création des points d’extension via l’onglet Extensions Points Intro. Conc. Plug-in - M. Baron - Page 70
  71. 71. Structure d’un plug-in : build.properties Le mécanisme de Build du plug-in est dirigé par le fichier de configuration build.properties formaté comme un fichier de properties Java Ce fichier est généré par l’assistant de création de plug-ins et contient toutes les informations sur la manière de compiler les sources pour les transformer en JAR Les clés importantes du fichier source.library : liste les répertoires sources qui seront compiléskeulkeul.blogspot.com output.library : liste les répertoires qui recevront le résultat de la compilation bin.includes : liste les fichiers qui seront inclus dans la version déployée du plug-in Intro. Conc. Plug-in - M. Baron - Page 71
  72. 72. Structure d’un plug-in : build.properties Exemple : build.properties du plug-in ExportExample Pour chaque librairie du plug-in indiquer les répertoires sources Build.properties du à compiler projet ExportExample Pour chaque librairie du plug-in indiquer les répertoires qui recevront la compilation Dans cet exemple seul les sources du plug-in sont compilés (noté « . »)keulkeul.blogspot.com Liste l’ensemble des fichiers qui seront inclus inclus dans Faites attention d’inclure l’archive de déploiement du (bin.includes) toutes les ressources plug-in nécessaire au bon fonctionnement du plug-in (images, dll, …) Intro. Conc. Plug-in - M. Baron - Page 72
  73. 73. Structure d’un plug-in : build.properties Exemple (suite) : build.properties du plug-in ExportExample sources.. bin.includeskeulkeul.blogspot.com Intro. Conc. Plug-in - M. Baron - Page 73
  74. 74. Déployer les plug-ins Quand le développement des plug-ins est terminé, les plug-ins peuvent être déployés De manière générale, pour chaque plug-in déployé, une archive JAR est générée Une fois les fichiers JAR générés, il suffit de copier les archives dans le répertoire plug-in de la version Eclipse qui doit accueillir ces nouveaux plug-ins La génération de la version à déployer s’appuie sur le fichier de configuration build.properties (voir précédemment) Dans le cas des applications Eclipse RCP (version standalonekeulkeul.blogspot.com d’un plug-in), nous utiliserons la notion de product pour générer la version de déploiement L’environnement Eclipse fournit un assistant pour en générer une version « prête à l’emploi » Intro. Conc. Plug-in - M. Baron - Page 74
  75. 75. Déployer les plug-ins Sélectionner à partir du menu Eclipse l’action File - Export pour ouvrir la liste des assistants liés à l’exportation Choisir l’assistant Deployable plug-ins and fragmentskeulkeul.blogspot.com Intro. Conc. Plug-in - M. Baron - Page 75
  76. 76. Déployer les plug-ins Choisir les plug-ins à déployer Le résultat de la génération Différentes options sera placé dans un répertoirekeulkeul.blogspot.com Le résultat de la génération sera placé dans une archive Intro. Conc. Plug-in - M. Baron - Page 76
  77. 77. Déployer les plug-ins Précise si les sources doivent être incluses Onglet Options Précise si les packages doivent être archivés dans des JAR Génère également une Remplace les chaînes « .qualifier » tâche ANT relatif à cette contenues dans build.properties par la tâche d’exportation valeur donnée du champ de texte Onglet JAR Signing Ensemble d’options pour signer un JARkeulkeul.blogspot.com Un cours sur la signature des JARs est disponible à l’adresse mbaron.developpez.com/jws Intro. Conc. Plug-in - M. Baron - Page 77
  78. 78. Structure d’un plug-in : Activator Un plug-in fournit une classe appelée Activator chargée de gérer le cycle de vie du plug-in lors de son utilisation gérer les ressources qui doivent être chargées au démarrage du plug-in Un objet Activator est un sous type de la classe Plugin Le nom de la classe est définie par le fichier de configuration MANIFEST.MF du plug-in au niveau de l’information Bundle-Activator Un objet Activator n’est pas obligatoire, un objet de lakeulkeul.blogspot.com plateforme sera alors utilisé par défaut qui ignore les requêtes liées au cycle de vie Dans la suite, nous étudierons les méthodes fournit par la classe Plugin Intro. Conc. Plug-in - M. Baron - Page 78
  79. 79. Activator : cycle de vie Le cycle de vie lors de l’utilisation du plug-in est géré par start(BundleContext context) throws Exception : déclenchée quand le plug-in est chargé stop(BundleContext context) throws Exception : déclenchée quand le plug-in est détruit La politique de chargement par défaut du plug-in est dite Lazy-Loading, ce qui signifie que le plug-in est chargé quand il doit être utilisé (utilisation d’un service par exemple) Si vous redéfinissez ces méthodes, rappeler obligatoirementkeulkeul.blogspot.com l’implémentation de la super classe Evitez également d’effectuer dans ces méthodes des traite- ments couteux (mémoire et rapidité) qui pourraient ralentir de le démarrage du plug-in Intro. Conc. Plug-in - M. Baron - Page 79
  80. 80. Activator : cycle de vie Pour accéder facilement à l’instance d’un Activator utiliser le design pattern Singleton Le design pattern Singleton permet la création d’objets uniques dont il n’existe qu’une seule instance Principe général de mise en œuvre d’un Singleton A la création d’un « singleton » vérifier si il existe déjà une instance Si elle existe fournir l’instance, si elle n’existe pas création d’une instance Lors de la création de la classe Activator par l’outil PDE, une méthode static est générée automatiquementkeulkeul.blogspot.com public static Activator getDefault() : retourne l’instance unique de l’objet Activator La mise en œuvre du singleton est obtenue par l’intermé- diaire de la méthode start appelée qu’une seule- M. Baron - Page Intro. Conc. Plug-in fois 80
  81. 81. Activator : cycle de vie Nous présentons dans la suite un exemple qui permet de montrer la politique de chargement via le « LazyLoading » Un nouveau plug-in appelé LazyLoadingExample fournit une vue qui fait appel aux services fournit par ExportExample La vue de LazyLoadingExemple propose trois boutons Creation : demande une instance de type ISerializeName au plug-in ExportExample. Il s’agit du premier appel à ExportExample, le plug-in est donc démarré Sauvegarde : demande de sauvegarde. Le bouton n’est activé que si l’action Creation a été effectuéekeulkeul.blogspot.com Chargement : demande de chargement. Le bouton n’est activé que si l’action Creation a été effectuée Le plug-in ExportExample a été modifié pour notifier dans la console le démarrage du plug-in Intro. Conc. Plug-in - M. Baron - Page 81
  82. 82. Activator : cycle de vie Exemple : principe de LazyLoading d’un plug-in Lors de l’appui sur le bouton Creation, le plug-in ExportExample est chargé, les boutons Sauvegarde et Chargement sont activés et le bouton Creation est désactivé Lors de l’appui sur le bouton Sauvegarde le sérialisation est réaliséekeulkeul.blogspot.com Intro. Conc. Plug-in - M. Baron - Page 82
  83. 83. Activator : cycle de vie Exemple (suite) : principe de LazyLoading d’un plug-in Activator.java du projet ExportExample package eclipse.plugin.exportexample; Au moment du public class Activator extends Plugin { démarrage du plug-in ... (réalisé une seule fois) public ISerializeName getSerializeInstance() { l’instance courante est return new SerializeName(); } stockée public void start(BundleContext context) throws Exception { super.start(context); plugin = this; Les méthodes start et stop System.out.println(Le Plug-In ExportExample est chargé); ont été décorées d’un } affichage vers la console pour avertir le démarrage public void stop(BundleContext context) throws Exception { plugin = null; et l’arrêt du plug-inkeulkeul.blogspot.com super.stop(context); System.out.println(Le Plug-in ExportExample est arrété); } public static Activator getDefault() { return plugin Méthode permettant } d’accéder au singleton } de l’objet Activator Intro. Conc. Plug-in - M. Baron - Page 83

×