mardi, avril 20, 2010

J'ai besoin ... d'utiliser Tycho - Partie 2 : Générer les poms Maven

Dans le billet précédent, nous avons présenté l'installation de Maven 3. Toutefois, pour l'instant nous n'avons pas encore exploité Tycho. Ce billet se propose de vous montrer comment générer à partir de n'importe quel projet OSGi (bundle et plugin) les descripteurs pom.xml utilisés par Maven.

Au niveau des logiciels utilisés en plus de Maven 3, nous trouvons Eclipse 3.5.2 avec le plugin m2eclipse pour faciliter l'édition des pom.xml. A noter que seul Maven 3 est obligatoire. Par ailleurs, l'expérimentation se fera sous Windows 7 64bits.

Pour commencer en douceur, nous allons utiliser un bundle OSGi dont l'objectif est d'afficher sur la console "HelloWorld Tycho". Dans la suite de cette série des J'ai besoin ..., nous développerons également une application RCP basée sur plusieurs plugins.

Construire un bundle OSGi
Une application à base OSGi est définie par un ensemble de bundles OSGi. Par conséquent nous définissons un répertoire parent contenant un ensemble de sous répertoires. Chaque sous répertoire est un bundle OSGi. Du point de vue Maven le répertoire parent va contenir un pom.xml qui listera des modules. Chaque module sera défini par un pom.xml localisé à la racine de chaque répertoire.

Dans la suite, nous montrons comment construire le répertoire parent et le répertoire du bundle OSGi.
  • Ouvrir l'assistant de création de bundle OSGI (File -> New -> Project ... et choisir Plug-in Project).
  • Dans le nom du projet choisir eclipse.tycho.osgifirstbundle
  • Pour l'emplacement de sauvegarde du contenu du bundle choisir un répertoire situé sous un répertoire parent. Exemple : D:\workspaceTycho\eclipse.tycho.osgifirstexample\eclipse.tycho.osgifirstbundleeclipse.tycho.osgifirstexample désigne le nom du répertoire parent et où eclipse.tycho.osgifirstbundle désigne le répertoire du bundle.
  • Choisir Equinox comme plateforme cible et faire Next
  • Laisser les paramètres par défaut de cet écran puis faire Next
  • Choisir comme patron de développement le patron Hello OSGi Bundle puis faire Next
  • Modifier le message Hello World!! en Hello World Tycho!! puis faire Finish
Le bundle est maintenant créé et vous devriez obtenir l'arborescence suivante sur votre disque.
d: \-
workspaceTycho \-
eclipse.tycho.osgifirstexample \-
eclipse.tycho.osgifirstbundle \-
META-INF \-
MANIFEST.MF
src \-
eclipse \-
tycho \-
osgifirstbundle \-
Activator.java
.classpath
.project
Générer les pom.xml
Nous allons compléter cette arborescence en ajoutant deux fichiers pom.xml localisés respectivement dans le répertoire parent et le répertoire du bundle.

Deux solutions disponibles : soit vous les ajoutez manuellement soit vous les générez via un plugin Maven fourni par Tycho : maven-tycho-plugin:generate-poms. Nous choisirons la seconde solution pour créer les fichiers pom.xml.

Pour ce faire, ouvrir l'invite de commande de Windows puis se placer dans le répertoire parent eclipse.tycho.osgifirstexample
mvn3 org.sonatype.tycho:maven-tycho-plugin:generate-poms -DgroupId=eclipse.tycho
Cette ligne de commande va tout d'abord télécharger toutes les dépendances nécessaire à l'exécution du plugin Tycho sous Maven. Examiner le répertoire repoMaven3 (défini lors de l'installation de Maven 3) pour remarquer toutes les dépendances téléchargées.

Une fois ces dépendances téléchargées, les deux fichiers pom.xml sont générés.

Ci-dessous le fichier de description Maven du répertoire parent.
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 ...>
<modelVersion>4.0.0</modelVersion>
<groupId>eclipse.tycho</groupId>
<artifactId>eclipse.tycho.osgifirstexample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>eclipse.tycho.osgifirstbundle</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.sonatype.tycho</groupId>
<artifactId>tycho-maven-plugin</artifactId>
<version>0.8.0</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
</project>
Vous remarquerez que le descripteur du répertoire parent défini le type de packaging (dans quel but le projet doit être construit) comme étant pom. Il liste également l'ensemble des modules qu'il assemble. Par ailleurs, il est précisé que le plugin Tycho est à utiliser.

Ci-dessous le fichier de description pom.xml du bundle eclipse.tycho.osgifirstbundle (défini comme un module Maven).
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 ... >
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>eclipse.tycho.osgifirstexample</artifactId>
<groupId<eclipse.tycho</groupId>
<version<0.0.1-SNAPSHOT</version>
</parent>
<groupId>eclipse.tycho</groupId>
<artifactId>eclipse.tycho.osgifirstbundle</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
Ce descripteur pom.xml définit le type de packaging comme étant un eclipse-plugin.

Comme vous pouvez constater les fichiers de description sont réduits au minimum. Aucune information concernant des dépendances n'a été donnée. En fait le descripteur du bundle eclipse.tycho.osgifirstbundle s'appuie sur le descripteur OSGi MANIFEST.MF pour établir les dépendances nécessaires.

A suivre ...
Dans le prochain billet, nous montrerons comment construire le bundle eclipse.tycho.osgifirstbundle à partir d'une plateforme cible localisée physiquement sur le disque.

7 commentaires:

  1. Très intéressant mais personnellement je me demande si il n'y a pas trop de fichiers de configurations. Entre les plugin.xml, build.properties, web.xml, pom.xml on se perd totalement. De plus quand une erreur se glisse dans ces fichiers elle est extrêmement difficile à détecter et donc à corriger. Et je parle même pas de l'utilisation de Spring et autres frameworks à la mode qui nécessitent une multitude de fichiers xml différents. En plus je trouve que manipuler directement les fichiers xml est une hérésie.
    En fait je pense que ces outils sont intéressants mais pas à utiliser systématiquement.

    Martial

    RépondreSupprimer
  2. Martial,

    C'est vrai personnellement je suis d'accord avec toi. Ajouter un nouveau fichier de configuration c'est un pas de plus pour rendre encore plus complexe la plateforme Eclipse.

    C'est une première étape pour Tycho et Maven dans l'intégration avec la plateforme Eclipse. Qui sait, ce n'est qu'un début, il y aura peut être des améliorations par la suite. On ne sait jamais M2Eclipse s'intègrera peut être dans l'outil PDE.

    Le plus intéressant viendra dans les billets qui vont suivre. Le build automatique d'application RCP devient vraiment très simple.

    RépondreSupprimer
  3. Salut Mickael,

    Merci pour ton blog, qui tombe à pic pour me permettre (hopefully) d'introduire maven/tycho dans mon build process.

    Actuellement, j'ai besoin d'utiliser (et j'utilise) des customBuildCallbacks (fichier ant customBuildCallbacks.xml) pour la construction d'un de mes plugins.

    Avant que je n'investisse trop de temps dedans, sais-tu si cette contrainte est bloquante ou pas pour l'utilisation de Tycho ?

    RépondreSupprimer
  4. Bonjour Laurent,

    Sincèrement désolé mais concernant l'utilisation des builds de plugins via les tâches ANT, je n'ai pas trop essayé.

    J'allais te conseiller de voir du côté du forum de Tycho mais je vois que tu as déjà posté un post ;-)

    Mickael

    RépondreSupprimer
  5. J'ai eu la réponse de Jason Van Zyl en personne.
    Les custom callbacks sont des tâches ant. Elles ne sont pas, et ne seront pas, supportées par Tycho.

    Pour ceux qui ont du code custom, il faudra donc migrer le code dans les plugins maven appropriés (s'ils existent !).

    RépondreSupprimer
  6. Pas trop déçu ?

    En tout cas, tu as peut être moyen de développer des plugins appropriés mais bon ça demandera un investissement.

    RépondreSupprimer
  7. Ils forcent un peu la main, mais bon je peux aussi comprendre leur position.

    Pour mon besoin spécifique, j'ai de la chance, car les tâches de compilation AOT clojure et de génération de binding jibx disposent déjà toutes 2 d'un plugin maven, donc je n'ai qu'à embrasser maven à nouveau et tout ira bien :-)

    RépondreSupprimer