Construire ses plugins Eclipse RCP avec Maven ? C’est plus facile maintenant avec Maven 3 et Tycho !

Par Pascal Leclercq • 16 fév, 2010 • Catégorie: Build, Eclipse RCP, Java

Il y a de cela un peu plus d’un an, lorsque je cherchais un moyen de construire un plugin Eclipse avec Maven, je tombais presque par hasard sur une réponse laconique de Jason Van Zyl (le papa de maven): “Tycho”.
Mais, me diriez-vous : On ne pouvait pas contruire de plugin Eclipse avec Maven avant ???

Eh bien, en pratique, on pouvait parvenir à compiler des sources, à générer des fichiers manifest.mf voire à construire des “product” mais à quel prix ! A titre d’illustration, je vous invite à lire l’excellent article de Cyril Lakech et vous aurez une mince idée de la sueur et des larmes qu’il fallait accepter de verser pour mettre en place Maven sur des plugins avant d’apercevoir le graal.

Une autre alternative consistait à développer et maintenir ses propres “Mojo”; Grégory Levilain a ces dernières années ainsi développé et déployé sur de nombreux projets un ensemble de plugins Maven permettant d’adopter une optique “POM-FIRST”. Cette approche laisse à Maven le soin de gérer les versions des éléments du projet (plugins, fragments, features, update-sites, products), et de leurs dépendances. Ces travaux ont été initiés en 2006 lors de la mise en open-source du projet Wazaabi.

Mais alors que fournit Tycho de si merveilleux ?

Tout d’abord, Tycho fournit un mécanisme de résolution de dépendances s’appuyant sur le fichier MANIFEST.MF du plugin. Cela présente un double intérêt :

  • Les bundles OSGi (dont les plugins Eclipse font partie) disposent d’un mécanisme de résolution de dépendances plus abouti que celui fourni par maven (dépendances non-transitives, possibilité de préserver tout ou partie des paquetages d’un bundle,…).
  • De cette façon, le développeur n’a pas à se préoccuper de l’utilisation de Maven : il peut se concentrer sur le manifest.mf comme il est censé le faire normalement dans le PDE sans se soucier du pom.xml.
  • Par ailleurs, le PDE résout les dépendances incroyablement plus rapidement que ne le feraient q4e ou m2e en s’appuyant sur les informations du pom.xml.

Au final, un pom.xml minimal permettant de construire un plugin Eclipse se réduit pratiquement toujours à :

1
2
3
4
5
6
7
8
9
10
<project>
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.mycompany.mygroup</groupId>
		<artifactId>parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>com.mycompany.myplugin</artifactId>
	<packaging>eclipse-plugin</packaging>
</project>

Frugal n’est ce pas ?
Bien entendu, nous allons mettre des choses un peu plus intéressantes dans le pom.xml parent.

Le PDE et la notion de target platform

Avant d’aller plus loin, il est temps à présent de fournir un petit rappel concernant la façon d’utiliser le PDE (Plugin Development Environment). Par défaut, lorsque vous développez des plugins sous Eclipse vous utilisez la “target platform” courante. C’est à dire l’ensemble des plugins qui vous ont permis de démarrer votre IDE. C’est une très bonne pratique que de définir sa propre target platform:

  • Cela permet de travailler éventuellement sur une version différente des plugins Eclipse.
  • Cela permet de travailler sur un sous-ensemble des plugins (quelques dizaines suffisent la plupart du temps).
  • Cela permet d’ajouter vos propres plugins déjà construits sans polluer votre IDE.

Vous trouverez l’ensemble des target platform sous Eclipse dans “Windows–> preferences ->Plug-in Development -> Target Platform”

En somme, la target platform fournit les mêmes fonctionnalités qu’un repository Maven.

Il est donc tout à fait naturel de retrouver cette notion dans la résolution de dépendances de builds Tycho. Tycho propose actuellement 2 façons de résoudre la target platform utilisée pour ses builds.

  1. Par le biais du filesystem
  2. mvn clean install -Dtycho.targetPlatform=<c:/eclipse3.5>

  3. De façon beaucoup plus élégante, par le biais de repository P2 et maven combiné
  4. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    
    <project>
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>org.dynaresume</groupId>
    	<artifactId>parent</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<packaging>pom</packaging>
    	<modules>
    		<module>infrastructure</module>
    		<module>bundles-api</module>
    		<module>bundles-impl</module>
    		<module>bundles-ui</module>
    	</modules>
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.sonatype.tycho</groupId>
    				<artifactId>tycho-maven-plugin</artifactId>
    				<version>0.6.0</version>
    				<extensions>true</extensions>
    			</plugin>
    			<plugin>
    				<groupId>org.sonatype.tycho</groupId>
    				<artifactId>target-platform-configuration</artifactId>
    				<version>0.6.0</version>
    				<configuration>
    					<resolver>p2</resolver>
    					<pomDependencies>consider</pomDependencies>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
     
    	<repositories>
    		<repository>
    			<id>gallileo</id>
    			<layout>p2</layout>
    			<url>http://download.eclipse.org/releases/galileo</url>
    		</repository>
    		<repository>
    			<id>com.springsource.repository.bundles.release</id>
    			<name>SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases</name>
    			<url>http://repository.springsource.com/maven/bundles/release</url>
    		</repository>
     
    		<repository>
    			<id>com.springsource.repository.bundles.external</id>
    			<name>SpringSource Enterprise Bundle Repository - External Bundle
    				Releases</name>
    			<url>http://repository.springsource.com/maven/bundles/external</url>
    		</repository>
              </repositories>
    </project>

Conclusion

Cela laisse présager des jours heureux pour tous les développeurs RCP. A titre individuel, je commence fortement à songer à l’utilisation de Tycho pour construire et assembler en headless non seulement des plugins RCP mais aussi tous les bundles OSGi qui se présentent.

Mais alors, vous allez me dire pourquoi n’ai je pas utilisé Tycho plus tôt ?

Principalement parce que Tycho ne fonctionne qu’avec Maven 3 dont les pseudo release alpha-x sont à peine sorties. Toutefois, rassurez vous, vos pom.xml actuels sont censés être parfaitement portables vers Maven 3. Des centaines de tests unitaires sont utilisés pour vérifier cela et actuellement il ne semble pas y avoir de défection.

Il subsiste un point sur lequel Tycho n’apporte pas à ce jour de réponse satisfaisante à ceux qui sont habitués aux cycles de développements fournis par Maven : la synchronisation pom.xml/manifest.mf lors de la phase de release. Ceci est en passe d’être corrigé dans la version 0.7.0.

Pour aller plus loin :

Marqué comme: , , ,

8 Réponses »

  1. Article sympa mais pour de l’intégration continue ce n’est pas top…
    On ne peut pas encore créer un update site à partir d’un repo Maven, et l’export d’une TP vers Maven peut vite devenir catastrophique (surtout si on veut réutiliser des artifacts OSGi).

  2. Bonjour,
    on peut facilement gérer un update-site et une feature avec Tycho (cf. le lien “Tycho users docs”) en tant qu’artifact maven. Il suffit pour cela de créer un projet ayant le packaging “eclipse-feature” contenant le fichier feature.xml et un autre projet ayant pour packaging “eclipse-update-site” contenant le fichier site.xml.
    Un détail de la façon de procéder peut faire l’objet d’un autre billet mais honnêtement il n’y pas grand chose de plus à dire là-dessus.
    A noter que l’update-site est également (et surtout) un dépôt p2, donc utilisable comme repo d’autres builds Tycho.
    Quant à l’export d’une TP vers maven, je ne vois pas franchement l’intérêt : il vaut mieux dans tous les cas utiliser un dépôt “p2″ : a titre individuel je construits tous mes bundles osgi avec Tycho.

  3. Bonjour Pascal,

    Merci beaucoup pour ce retour.

    As-essayé d’utiliser les Assembly de Maven Tycho pour générer ton livrable ? Je vois que tu en parles dans ta conclusion.

    Mickael

  4. Bonjour Mickael,

    Je génére le livrable final avec lanceur depuis pusieurs mois déjà à partir d’un product “plugins-based”.

    Pour cela, il faut créer un projet dédié ne contenant que le fichier “product” XYZ.product, de créer un pom.xml dont l’artifactId vaut “XYZ” et positionner le packaging à “eclipse-application”. Il faut également configurer le “maven-osgi-packaging-plugin” comme suit :

    org.sonatype.tycho
    maven-osgi-packaging-plugin



    linux
    gtk
    x86_64


    win32
    win32
    x86


    Tu trouveras plus d’exemples et d’information dans le repository Git de Tycho :
    http://github.com/sonatype/sonatype-tycho
    et notamment les projets exemples
    http://github.com/sonatype/sonatype-tycho/tree/master/tycho-its/projects/

  5. Salut Pascal !

    Bravo pour ton blog.

    Je vois qu’on travaille avec les mêmes outils. J’essaie moi aussi de mettre en place de l’intégration continue sur des projets eclipse RCP.

    J’ai pas mal sué avec Tycho, mon ressenti est que l’information est mal organisée et j’ai perdu facilement du temps sur des détails. Sinon ça marche pas mal et ça comble un gros manque.

    La dernière chose que je n’ai pas réussi à faire est de générer un feature based product qui permet de faire fonctionner le système de provisioning P2 apparu avec Galileo. En gros, j’ai mis en place un mécanisme de mise à jour automatique silencieux. Ce mécanisme n’est actif que si le produit packagé est “P2ifié”, c’est-à-dire si le product est généré avec les metadatas P2. Tycho ne semble pas le faire pour les products alors qu’il le fait pour les update sites.

    Simon

    Ps : d’ailleurs merci à Mickael pour son billet sur Tycho ;o)

  6. Bonjour Simon et Merci.

    actuellement, je livre des plugins based product “P2ifié”, pour cela j’utilse le plugin maven-exec-plugin qui permet de lancer des commandes systèmes. Il est clair qu’il faut que cela soit mieux intégré à Tycho. J’avais, il y a déjà quelques mois de cela posé une demande d’évlution dans ce sens.
    La bonne nouvelle est que Pascal Rapicault (le créateur de p2) viens de rejoindre Sonatype. On peut donc raisonnablement espèrer des évolutions majeures dans cette direction. L’étape ultime étant un mécanisme complet de “repository roundtrip” qui existe déjà partiellement mais avec Nexus Pro seulement.(cf. https://docs.sonatype.com/display/NX/Tycho+Nexus+Pro+Build+Roundtrip).

    Il est peut être temps que l’on parle de tout çà autour d’un verre ? :)

    Pascal

  7. Bonjour Pascal,

    J’ai testé le plugin Tycho, dans sa version 0.8, pour construire un product d’une simple application Eclipse RCP sous différents OS (Win32, MAC OS, …) en utilisant le plugin maven-osgi-packaging-plugin que tu m’avais indiqué.

    J’arrive à générer les pom.xml à partir de generate-poms à construire le product à partir du filesystem (via le répertoire de mon Eclipse + Delta Pack d’installé). A ce stade, je suis très satisfait.

    Par contre avec la solution d’un entrepôt p2, j’arrive à générer uniquement la version Win32. Pour les autres plateformes, quoiqu’il arrive Tycho ne trouve pas les plugins spécifiquement contenus dans le fameux DeltaPack. J’avais toujours une erreur de type Could not resolve plugin org.eclipse.swt.gtk.linux …

    En regardant l’exemple itp03-crossplatform fourni dans l’entrepot GIT, j’ai remarqué que pour préciser les plateformes cibles il fallait utilisé le plugin target-platform-configuration et non maven-osgi-packaging-plugin.

    De ce fait ça fonctionne et je me paye même le luxe de choisir la version de la plateforme 3.5.2 ou 3.6. C’est merveilleux …

    Je vais préparer prochainement des billets sur mon blog pour poser à plat tout ça.

    Mickael

    PS : @Simon, il faut vraiment que tu penses à ouvrir un blog pour faire partager tes connaissances assez pointues sur la plateforme Eclipse.

  8. Bonjour,
    Une petite alternative à tycho http://blogs.nuxeo.com/dev/2010/11/working-with-osgi-and-maven-in-eclipse.html qui permet de garder une structure de projet maven classique tout en travaillant dans PDE en mode OSGi

Laisser un Commentaire