Pascalleclercq's Blog

14/02/2010

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

Filed under: Eclipse RCP,Maven,OSGi — pascalleclercq @ 9:48

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 à :

<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. <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.bundles.release</id>
             <name>SpringSource Bundle Releases</name>
             <url>http://repo.spring.com/release</url>
            </repository>
    
            <repository>
               <id>com.springsource.bundles.external</id>
               <name>External Bundle	Releases</name>
               <url>http://repo.spring.com/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 :

15 commentaires »

  1. Excellente chose que de lancer ton blog !

    Depuis le temps que ca te démange, le plus dur est de prendre le temps de publier.

    Merci pour cet article et tiens nous au courant des suites de tes découvertes sur M2/Tycho/PDE/OSGI & co

    Commentaire par Cyril Lakech — 14/02/2010 @ 9:55 | Réponse

    • Merci Cyril,
      je compte bien ne pas en rester là et rendre toujours plus accessible l’accès aux technos OSGi based.

      Commentaire par pascalleclercq — 14/02/2010 @ 9:59 | Réponse

  2. Bonjour Pascal,

    Je suis aussi ravi que Cyril que tu te lances dans ton blog:)

    Concernant Tycho, je ne connais pas du tout et voici mes questions de débutants que je me suis posé quand j’ai lu ton billet :

    1. Tycho c’est un plugin Maven? Un plugin Eclipse?
    2. « Tycho fournit un mécanisme de résolution de dépendances », ca signifie quoi concrètement? Tu mets des import package ds le MANIFEST.MF et tycho est capable de télécharger les bundles de ces packages?

    Angelo

    Commentaire par akrogen — 18/02/2010 @ 9:23 | Réponse

    • Bonjour Angelo,

      Heureux que ce blog te plaise :).

      Pour répondre à tes questions :
      1. Tycho est un plugin maven qui ne fonctionne qu’avec maven 3 (cf. http://maven.apache.org/download.html).
      2. Tycho fonctionne en mode « manifest first » c’est à dire qu’il exploite les Import-Package et autres Required-Bundle pour définir les dépendances à utilser à la compilation. Couplé à un repository « p2 », Tycho est capable de téléchager les bundles des packages concernés. Tycho va plus loin car il est capable de résoudre des dépendances maven « classiques » (i.e. avec la balise ), ce qui est très utile lorsque les bundles ne sont pas disponibles dans des repos p2.

      Commentaire par pascalleclercq — 21/02/2010 @ 8:36 | Réponse

  3. Pascal,

    J’ai une question toute bête concernant les plugins Tycho pour Maven.

    Sais-tu s’il existe quelque part chez Sonatype ou ailleurs des pages qui regrouperaient la documentation technique de chaque plugin. A part regarder dans le code, je n’ai pas encore trouvé de pages comme on peut en trouver chez codehaus ou directement sur le site de Maven

    Mickael

    Commentaire par BARON Mickael — 06/05/2010 @ 6:15 | Réponse

    • Bonjour Mickael,

      Officiellement, la principale source d’information est http://tycho.sonatype.org. Comme tu as sans doute déjà pus le constater tu n’y trouve pas (encore) l’information que tu cherches. A titre individuel, lorsque j’avais un besoin d’exemples d’utilisation des plugins Tycho je suis allé voir les exemples :
      http://github.com/sonatype/sonatype-tycho/tree/master/tycho-its/projects/.

      Par chance la plupart des projets ont des noms explicites.

      Je pense que je vais (rapidement) faire un billet sur les plugins Tycho que j’ai utilisé :

      1. tycho-maven-plugin
      2. maven-osgi-compiler-plugin
      3. target-platform-configuration
      4. maven-osgi-packaging-plugin

      Commentaire par pascalleclercq — 06/05/2010 @ 7:52 | Réponse

      • Merci Pascal,

        J’attends avec impatience tes prochains billets.

        De mon côté, je vais faire avec les éléments que je dispose pour continuer ma suite de billets sur Tycho.

        Mickael

        Commentaire par BARON Mickael — 07/05/2010 @ 6:28

  4. Bonjour,

    En recherche constante d’information afin de « maveniser » un projet existant, je voulais savoir si vous aviez de la doc concernant la sémantique du fichier POM.
    PS: merci pour cet article fort constructif 🙂

    Loïc

    Commentaire par MARTIN Loïc — 11/05/2010 @ 9:58 | Réponse

  5. Bonjour,

    je cherche de la doc sur la syntaxe et la sémantique des fichier POM.xml.
    Merci si quelqu’un peut me renseigner.

    Loïc

    Commentaire par MARTIN Loïc — 11/05/2010 @ 5:13 | Réponse

  6. Bonjour,
    Merci pour votre article.

    J’ai essayé d’utiliser Tycho à partir de trois projets Eclipse (feature, plugin et Update site) + un projet maven « parent » et ça marche.

    Par contre quand on fait un mvn install (ou deploy) seul le répertoire « target » de l’update site contient les informations du nouveau plugin au format P2 (site.xml, artifacts.xml, content.xml, plugins, feature).
    Ces informations ne sont pas déployées dans le repo maven local (ou distant).

    Commentaire par Eric — 10/06/2010 @ 11:59 | Réponse

  7. Bonjour,
    J’ai trouvé un moyen de me passer de tycho pour que pde et maven cohabitent ensemble: http://blogs.nuxeo.com/dev/2010/11/working-with-osgi-and-maven-in-eclipse.html
    Ca peut etre vous interesser 🙂
    Sun.

    Commentaire par Sun — 30/11/2010 @ 10:01 | Réponse

    • Bonjour et merci pour ce lien,

      A titre d’info, Tycho va remplacer le PDE Build (cf. Pascal Rapicault le concepteur du PDE Build que l’on connais). Il me semble à moyen terme plus interessant de tout passer sur Tycho.

      Dans d’autres cas d’utilisation, j’avais utilisé le fameux maven-bundle-plugin (http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html) mais je le trouve sensiblement moins intéressant car il n’est pas « manifest first »..

      Bien à vous.

      Commentaire par pascalleclercq — 30/11/2010 @ 10:49 | Réponse


RSS feed for comments on this post. TrackBack URI

Répondre à Eric Annuler la réponse.

Propulsé par WordPress.com.