Tutoriel sur Tycho pour la construction automatique d'un product Eclipse

Mickael BARON alias Keulkeul

Ce tutoriel est une introduction à Tycho, un plugin pour Maven permettant de construire des bundles OSGi et des plugins Eclipse. Nous montrons par l'exemple comment construire automatiquement des exécutables Eclipse (appelés « product ») par l'intermédiaire de Tycho.

Les sources de l'exemple sont disponibles à l'adresse suivante : tycho.zip.

Si vous souhaitez donner votre avis sur ce tutoriel, profitez de cette discussion Commentez

- Titre : Tutoriel sur Tycho pour la construction automatique d'un product Eclipse

- Auteur : Mickael BARON alias Keulkeul

- Parution : 28 octobre 2011

- Mise à jour : 27 mai 2013

- Licence : Le contenu de cet article est rédigé par Mickael BARON et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 3.0 non transposé. Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright ® 2013 Developpez.com.

Sommaire

- 1. Introduction

- 2. Installation des outils

- 2-A. Eclipse RCP / Plugin

- 2-B. Maven 3

- 2-C. Tycho

- 2-D. M2Eclipse

- 3. Construction des plugins

- 3-A. Création d'un projet Agrégateur (keulkeul.tychorcpdemo.aggregator)

- 3-B. Création du plugin RCP (keulkeul.tychorcpdemo.rcp)

- 3-C. Création d'un projet parent (keulkeul.tychorcpdemo.parent)

- 3-D. Démarrer une construction du projet via Maven

- 3-E. Création d'un projet feature (keulkeul.tychorcpdemo.feature)

- 3-F. Création d'un projet update site (keulkeul.tychorcpdemo.repository)

- 3-G. Création d'un fichier product (keulkeul.tychorcpdemo.repository)

- 4. Conclusion

- 5. Liens

- 6. Sources

- 7. Remerciements

1 - Introduction

Historiquement la construction automatique de bundles OSGi ou de plugins Eclipse passait par l'utilisation d'un ensemble de tâches ANT fournies par la plateforme Eclipse. Malheureusement la manipulation de ces tâches ANT n'était pas simple et l'utilisation dans un outil d'intégration continue (Jenkins, Cruise Control par exemple) était rendue difficile. À côté de cela, Maven l'outil de construction de binaires a démontré qu'il était aisé de compiler, de jouer des tests et de gérer les dépendances dans l'univers Java. Toutefois l'utilisation de Maven dans la plateforme Eclipse était impossible du fait qu'Eclipse se base sur une architecture OSGi. Avec l'arrivée de Tycho, qui est un plugin Maven, il est désormais possible d'utiliser toute la puissance de Maven pour construire des bundles OSGi et des plugins Eclipse.

Dans ce tutoriel, je vous propose l'utilisation du plugin Tycho dans le cas de la construction d'exécutables Eclipse RCP également appelés product. Nous montrons par l'exemple toutes les étapes nécessaires en insistant sur la structuration du projet en différents plugins et comment générer des binaires selon une version spécifique de la plateforme Eclipse.

Ce tutoriel suppose que vous disposiez des connaissances de base sur les technologies suivantes :

- développement de plugins avec la plateforme Eclipse (SWT/JFace, Eclipse RCP...), voir la page des tutoriels Eclipse de Developpez.com pour une mise à niveau ;

- construction de binaires avec Maven.

2 - Installation des outils

Cette section présente tous les outils utilisés dans le cadre de ce tutoriel. Nous signalons volontairement pour chaque outil, la version utilisée lors de la réalisation de ce tutoriel.

- Eclipse RCP / Plugin : l'environnement de développement Java pour développer des plugins (version 3.7.0).

- Maven 3 : l'outil de construction automatique de binaires.

- Tycho : le plugin pour Maven pour construire des binaires de bundles OSGi et de plugins Eclipse.

- M2Eclipse: l'intégration de Maven pour Eclipse.

Nous détaillons pour chacun de ces outils la procédure d'installation et de configuration.

2-A - Eclipse RCP / Plugin

L'environnement de développement Eclipse est naturellement utilisé puisqu'il intègre la plateforme de développement de plugins. Par ailleurs, nous utiliserons la version Indigo qui est la version courante au moment de l'écriture de ce tutoriel.

Le téléchargement de l'environnement de développement est obtenu sur le site de la fondation Eclipse : www.eclipse.org/downloads/.

Pour l'installation, décompresser l'archive dans le répertoire où vous installez généralement vos applications (par exemple : c:\program files).

2-B - Maven 3

Maven est un outil de construction de binaires pour la plateforme de développement Java. Il se distingue des autres outils dans le sens où il utilise une approche déclarative. En effet, le contenu et la structure d'un projet Java sont décrits.

Pour utiliser Tycho, vous devez obligatoirement installer la version de Maven 3 disponible en téléchargement sur le site de la fondatation Apache : maven.apache.org/.

Pour l'installation, suivre les étapes élémentaires suivantes :

- décompresser l'archive dans le répertoire où vous installez généralement vos applications (par exemple : c:\program files) ;

- créer une variable d'environnement M2_HOME qui pointe sur le répertoire de Maven (par exemple : c:\program files\maven3) ;

- ajouter le répertoire binaire de Maven à la variable d'environnement PATH.

2-C - Tycho

Tycho est un plugin pour Maven pour construire des binaires de bundles OSGi et de plugins Eclipse. Comme indiqué précédemment il ne peut fonctionner qu'à partir de la version 3 de Maven.

Pour l'installation, il suffit de compléter le fichier pom.xml au niveau de la balise <plugins>. Nous étudierons ce point plus précisément dans la suite au niveau de la section 3.

<build>
...
<plugins>
<plugin>
<!-- enable tycho build extension -->
<groupId>org.sonatype.tycho</groupId>
<artifactId>tycho-maven-plugin</artifactId>
<version>${tycho-version}</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
</project>

2-D - M2Eclipse

M2Eclipse est une intégration de Maven pour l'environnement de développement Eclipse. Son utilisation permet d'employer des commandes Maven directement dans Eclipse et permet également de rendre la manipulation du fichier pom.xml plus aisée puisqu'une interface graphique sous forme de formulaire remplace la représentation XML assez verbeuse.

Pour l'installation, nous utiliserons l'outil Marketplace de l'éditeur Eclipse. Voici les étapes.

- Ouvrir l'outil Marketplace via le menu Help -> Eclipse Marketplace...

- Depuis la zone de texte Find, saisir la valeur M2Eclipse, puis cliquer sur "rechercher". Vous devriez obtenir le résultat présenté sur la capture d'écran ci-dessous :

- Cliquer sur Install depuis le plugin Maven Integration for Eclipse.

- Après un certain temps de recherche, vous devriez obtenir le résultat suivant, cliquer sur Next.

- Accepter la licence d'autorisation, puis cliquer sur Finish. Le plugin va être installé et il vous sera demandé de redémarrer Eclipse, ne pas accepter le redémarrage et quitter Eclipse.

- Avant de relancer Eclipse, modifier le fichier eclipse.ini situé à la racine de votre répertoire d'installation d'Eclipse afin de préciser le répertoire de votre JDK. Le plugin M2Eclipse utilise ce chemin pour exécuter ses commandes.

-vm
C:/Program Files (x86)/Java/jdk1.6.0_18/bin/javaw.exe

- Redémarrer Eclipse, ouvrir le menu des préférences (Window -> Preferences) et sélectionner les options liées à Maven.

- Depuis les options Maven, afficher les éléments liés à User Settings et préciser dans la zone User Settings votre fichier settings.xml (lié au répertoire d'installation de Maven 3) et cliquer sur Update Settings.

3 - Construction des plugins

Dans la suite, nous présentons l'utilisation de Tycho au travers d'une application RCP contenant une vue affichant un arbre. L'objectif final est de générer automatiquement une archive contenant notre product Eclipse.

Nous insistons dans un premier temps sur la décomposition de l'application en plusieurs projets, chacun contenant un fichier de description pom.xml. Cette décomposition est présentée ci-dessous :

- keulkeul.tychorcpdemo.aggregator : regroupe tous les autres projets ;

- keulkeul.tychorcpdemo.rcp : contient le plugin RCP ;

- keulkeul.tychorcpdemo.parent : le projet Parent au niveau Maven ;

- keulkeul.tychorcpdemo.feature : décrit un projet feature ;

- keulkeul.tychorcpdemo.repository : contient la description d'un product et l'update site.

Dans un second temps, nous détaillons le contenu de chaque fichier de description pom.xml afin d'indiquer les paramétrages pour Tycho.

3-A - Création d'un projet Agrégateur (keulkeul.tychorcpdemo.aggregator)

Ce projet Agrégateur aura comme seul but de contenir tous les sous-projets (plugins, feature, tests, repository p2...). Du point de vue Maven il s'agira de décrire dans le fichier pom.xml tous les sous-modules .

Veuillez suivre la démarche ci-dessous.

- Ouvrir l'assistant de création de projet File -> New -> Other...

- Choisir l'élément Maven Project de la catégorie Maven, l'écran ci-dessous doit apparaître :

- Cocher l'option Create a simple project (skip archetype selection), puis cliquer sur Next.

- Dans le champ de texte Group Id saisir la valeur tychorcpdemo.

- Dans le champ de texte Artifact Id saisir la valeur keulkeul.tychorcpdemo.aggregator.

- Au niveau de la sélection Packaging sélectionner la valeur pom puis cliquer sur Finish.

Un nouveau projet Maven sera créé contenant un fichier pom.xml. Nous modifierons ce fichier à chaque fois que nous ajouterons un nouveau module.

3-B - Création du plugin RCP (keulkeul.tychorcpdemo.rcp)

Ce plugin est particulier dans le sens où il s'agit d'un RCP (Rich Client Application) ce qui signifie qu'il peut être utilisé seul. Comme l'idée n'est pas d'apprendre à créer un plugin RCP nous utiliserons un exemple patron.

- Ouvrir l'assistant de création de projet File -> New -> Other...

- Choisir l'élément Plug-in Project depuis la catégorie Plug-in Development, puis cliquer sur Next. L'écran ci-dessous doit apparaître :

- Dans le champ Project Name saisir la valeur keulkeul.tychorcpdemo.rcp.

- Décocher l'option Use default location.

- Créer un répertoire keulkeul.tychorcpdemo.rcp à la racine du répertoire du projet agrégateur créé précédemment, puis cliquer sur Next. L'écran suivant doit apparaître :

- Cocher la case Would you like to create a rich client application ? puis cliquer sur Next. L'écran suivant doit apparaître :

- Choisir comme patron RCP application with a view puis cliquer sur Next. L'écran suivant doit apparaître :

- Dans le champ Application window title saisir la valeur Keulkeul Tycho RCP Demo Application.

- Sélectionner l'option Add branding ce qui permettra d'être identifié comme un product lors de la création de la configuration d'exécution, puis cliquer sur Finish.

Un nouveau projet keulkeul.tychorcpdemo.rcp vient d'être créé. Pour s'assurer que ce plugin RCP fonctionne nous allons créer une configuration d'exécution.

- Ouvrir l'écran de création des configurations. Depuis le menu principal Run -> Run Configurations ... L'écran suivant doit apparaître :

- Créer une nouvelle configuration de type Eclipse Application dont le nom sera TychoRCPDemo.

- Choisir depuis Run a product la valeur keulkeul.tychorcpdemo.rcp.product (uniquement disponible si vous aviez coché l'option Add branding. Sélectionner l'onglet Plug-ins et vous devriez obtenir l'écran suivant :

- Choisir depuis Launch with la valeur plug-ins selected below only.

- Décocher tous les plugins présents depuis le nœud racine Target Platform.

- Sélectionner uniquement le plugin keulkeul.tychorcpdemo.rcp depuis le nœud racine Workspace.

- Cliquer sur Add Required Plug-ins pour ajouter uniquement les plugins requis à l'exécution de ce plugin RCP.

- Cliquer sur Run. Vous devriez obtenir l'écran suivant :

- Ajouter un nouveau fichier Maven pom.xml à la racine de ce projet (keulkeul.tychorcpdemo.rcp) dont le contenu est le suivant :

<project>
<modelversion>4.0.0</modelversion>
<parent>
<groupid>tychorcpdemo</groupid>
<artifactid>keulkeul.tychorcpdemo.parent</artifactid>
<version>1.0.0-SNAPSHOT</version>
<relativepath>../keulkeul.tychorcpdemo.parent/pom.xml</relativepath>
</parent>
<groupid>tychorcpdemo</groupid>
<artifactid>keulkeul.tychorcpdemo.rcp</artifactid>
<version>1.0.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>

- Comme vous pouvez le constater, ce fichier pom.xml fait référence à un pom.xml parent que nous définirons plus tard. Intéressons-nous d'abord à l'ajout d'un projet keulkeul.tychorcpdemo.rcp comme module au projet keulkeul.tychorcpdemo.aggregator. Par conséquent modifier le fichier pom.xml du projet keulkeul.tychorcpdemo.aggregator de cette manière :

<project>
<modelVersion>4.0.0</modelVersion>
<groupId>tychorcpdemo</groupId>
<artifactId>keulkeul.tychorcpdemo.aggregator</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>keulkeul.tychorcpdemo.parent</module>
<module>keulkeul.tychorcpdemo.rcp</module>
</modules>
</project>

- De même nous profitons de cette modification pour ajouter un autre module keulkeul.tychorcpdemo.parent.

3-C - Création d'un projet parent (keulkeul.tychorcpdemo.parent)

Le projet parent a pour objectif de contenir toutes les configurations propres à Tycho dont tous les plugins auront besoin. Il contiendra également les liens vers les entrepôts p2.

La démarche de création de ce projet est identique à celle utilisée pour créer le projet keulkeul.tychorcpdemo.aggregator à la différence que ce projet doit être placé à la racine du projet agrégateur. Pour les valeurs à donner dans le nouveau fichier pom.xml, suivre les indications données ci-dessous.

- Dans le champ de texte Group Id saisir la valeur tychorcpdemo.

- Dans le champ de texte Artifact Id saisir la valeur keulkeul.tychorcpdemo.parent.

- Au niveau de la sélection Packaging sélectionnez la valeur pom puis cliquer sur Finish.

- Compléter le fichier pom.xml généré par les informations liées à la configuration de Tycho

<project>
<modelVersion>4.0.0</modelVersion>
<groupId>tychorcpdemo</groupId>
<artifactId>keulkeul.tychorcpdemo.parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>

<properties>
<tycho-version>0.11.0</tycho-version>
</properties>

<repositories>
<!-- configure p2 repository to resolve against -->
<repository>
<id>helios</id>
<layout>p2</layout>
<url>http://download.eclipse.org/releases/helios/</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<!-- enable tycho build extension -->
<groupId>org.sonatype.tycho</groupId>
<artifactId>tycho-maven-plugin</artifactId>
<version>${tycho-version}</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
</project>

À ce niveau vous devriez obtenir la structure de fichiers suivante :

keulkeul.tychorcpdemo.aggregator \-
pom.xml
keulkeul.tychorcpdemo.parent \-
pom.xml
keulkeul.tychorcpdemo.rcp \-
src \-
pom.xml

3-D - Démarrer une construction du projet via Maven

Nous allons volontairement construire le projet en utilisant l'invite de commandes de Windows au lieu d'utiliser le plugin M2Eclipse. En effet, Tycho est surtout utilisé pour construire le projet final via un outil d'intégration continue. C'est une façon de s'assurer que cette construction fonctionne en dehors de l'environnement Eclipse.

Ouvrir l'invite de commandes de Windows et se placer à la racine du répertoire parent. Saisir la ligne de commande ci-dessous :

mvn clean install

Normalement si tout se passe bien vous devriez obtenir le message suivant :

3-E - Création d'un projet feature (keulkeul.tychorcpdemo.feature)

Ce projet de type feature va nous permettre de regrouper dans une feature l'ensemble des plugins de notre application. Il faut admettre que pour l'instant il n'y en a pas énormément. L'idée est que si vous souhaitez ajouter de nouveaux plugins, vous n'aurez qu'à modifier cette feature.

- Ouvrir l'assistant de création de projet File -> New -> Other...

- Choisir l'élément Feature Project depuis la catégorie Plug-in Development, puis cliquer sur Next. L'écran ci-dessous doit apparaître :

- Choisir comme nom de projet keulkeul.tychorcpdemo.feature.

- Personnaliser le répertoire de travail pour être à la racine du projet keulkeul.tychorcpdemo.aggregator.

- Choisir depuis la liste des plugins disponibles (Initialize from the plug-ins list) le plugin keulkeul.tychorcpdemo.rcp puis cliquer sur Finish.

Un nouveau projet keulkeul.tychorcpdemo.feature vient d'être créé.

- Ajouter un nouveau fichier Maven pom.xml à la racine de ce projet dont le contenu est le suivant :

<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>tychorcpdemo</groupId>
<artifactId>keulkeul.tychorcpdemo.parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../keulkeul.tychorcpdemo.parent/pom.xml</relativePath>
</parent>
<groupId>tychorcpdemo</groupId>
<artifactId>keulkeul.tychorcpdemo.feature</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>eclipse-feature</packaging>
</project>

- Ajouter ce nouveau projet comme module en complétant le pom.xml du projet keulkeul.tychorcpdemo.aggregator.

- Vérifier que l'application se construit correctement via un mvn clean install.

3-F - Création d'un projet update site (keulkeul.tychorcpdemo.repository)

Ce nouveau projet a pour objectif de créer un update site de notre projet. Cela permettra ainsi d'utiliser l'outil de mise à jour pour installer nos nouveaux plugins.

- Ouvrir l'assistant de création de projet File -> New -> Other...

- Choisir l'élément Plug-in Project depuis la catégorie Plug-in Development, puis cliquer sur Next. L'écran ci-dessous doit apparaître :

- Choisir comme nom de projet keulkeul.tychorcpdemo.repository.

- Personnaliser le répertoire de travail pour être à la racine du projet keulkeul.tychorcpdemo.aggregator.

- Cocher l'option Generate a web page listing all available features within the site puis cliquer sur Finish.

- Depuis le nouveau projet généré, renommer le fichier site.xml en category.xml.

- Ouvrir le fichier site.xml et depuis l'onglet Site Map créer une nouvelle catégorie appelée TychoRCPDemo.

- Depuis cette nouvelle catégorie, ajouter la feature keulkeul.tychorcpdemo.feature créée précédemment (voir capture d'écran ci-dessous).

- Ajouter un nouveau fichier Maven pom.xml à la racine de ce projet dont le contenu est le suivant :

<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>tychorcpdemo</groupId>
<artifactId>keulkeul.tychorcpdemo.parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../keulkeul.tychorcpdemo.parent/pom.xml</relativePath>
</parent>
<groupId>tychorcpdemo</groupId>
<artifactId>fr.ensma.lisi.tychorcpdemo.repository</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>eclipse-repository</packaging>
</project>

- Ajouter ce nouveau projet comme module en complétant le pom.xml du projet keulkeul.tychorcpdemo.aggregator.

- Vérifier que l'application se construit correctement via un mvn clean install.

3-G - Création d'un fichier product (keulkeul.tychorcpdemo.repository)

Le fichier product contient toutes les informations relatives à la construction d'un exécutable Eclipse (plateformes supportées, le splashscreen, le nom de l'application, les images...).

- Ouvrir l'assistant de création de projet File -> New -> Other...

- Choisir l'élément Product Configuration depuis la catégorie Plug-in Development, puis cliquer sur Next. L'écran ci-dessous doit apparaître :

- Choisir le projet keulkeul.tychorcpdemo.repository.

- Saisir la valeur tychorcpdemo.product dans le champ File name.

- Choisir pour l'option Use a launch configuration la valeur TychoRCPDemo puis cliquer sur Finish.

- Éditer en mode texte le fichier tychorcpdemo.product (sans l'éditeur de configuration de product) et ajouter les instructions suivantes qui permettront de démarrer les plugins adéquats au lancement de l'application RCP

<configurations>
<plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="0" />
<plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
<plugin id="org.eclipse.osgi" autoStart="true" startLevel="-1" />
</configurations>

- Depuis l'onglet Overview du mode édition du fichier tychorcpdemo.product, saisir la valeur TychoRCPDemo.product.

- Modifier l'option The Product configuration is based on par la valeur features.

- S'assurer que la valeur keulkeul.tychorcpdemo.rcp.product est sélectionnée pour l'option Product et que la valeur keulkeul.tychorcpdemo.rcp.application est sélectionnée pour l'option Application. Voir capture d'écran ci-dessous :

- Depuis l'onglet Dependencies choisir la valeur keulkeul.tychorcpdemo.feature. Voir capture d'écran ci-dessous :

- Pour construire un product Eclipse selon un environnement donné (OS/WS/Arch) compléter le fichier pom.xml du projet keulkeul.tychorcpdemo.repository comme présenté ci-dessous :

<build>
<plugins>
<plugin>
<groupId>org.sonatype.tycho</groupId>
<artifactId>tycho-p2-director-plugin</artifactId>
<version>${tycho-version}</version>
<executions>
<execution>
<id>materialize-products</id>
<goals>
<goal>materialize-products</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

Finalement depuis le projet feature (keulkeul.tychorcpdemo.feature) il nous reste à ajouter le fragment SWT correspondant à la plateforme Windows (notre plateforme de tests) de façon à construire le product pour cette plateforme.

À noter que pour le support de différentes versions de Windows (64 bits par exemple) ou le support de différents systèmes d'exploitation (Linux, MAC OS X...), il sera nécessaire de réitérer cette étape.

- Ouvrir le fichier feature.xml et afficher l'onglet Plug-ins.

- Ajouter la feature org.eclipse.swt.win32.win32.x86 et définir la valeur win32 dans le champ Operating Systems, la valeur win32 dans le champ Window Systems et la valeur x86 dans le champ Architecture. Voir capture d'écran ci-dessous pour visualiser le résultat attendu :

- Vérifier que l'application se construit correctement via un mvn clean install. Depuis le répertoire keulkeul.tychorcpdemo.repository/target/products/TychoRCPDemo.product/win32/win32/x86 vous devriez obtenir le résultat de cette construction. Un product Eclipse construit automatiquement à l'aide de Maven/Tycho.

4 - Conclusion

Ce tutoriel a présenté une introduction à l'utilisation du plugin Tycho pour construire automatiquement un product Eclipse. Nous avons insisté sur la structuration des différents plugins qui composent notre projet et sur le contenu XML à placer dans les différents fichiers de description spécifiques à Maven.

De nombreuses fonctionnalités restent à découvrir concernant Tycho et notamment la possibilité d'exécuter des tests unitaires, de gérer des dépendances de bibliothèques tierces, de générer un product Eclipse selon la version de la plateforme, de déployer les nouveaux plugins dans un update site, et de faire référence à des plugins depuis un update site donné.

5 - Liens

Vous trouverez ci-dessous en ensemble de liens qui peuvent compléter ce tutoriel :

- Apprendre à construire un plugin : https://mbaron.developpez.com/eclipse/introplugin/.

- Quelques billets sur Tycho : http://keulkeul.blogspot.com/search/label/Tycho.

- Site de Tycho : http://www.eclipse.org/tycho/.

6 - Sources

Les sources de ce tutoriel sont disponibles ici : tycho.zip.

7 - Remerciements

Je tiens à remercier Nemek pour sa relecture technique. Je tiens également à remercier ClaudeLELOUP pour sa relecture orthographique.