En programmation Java il arrive de temps en temps qu’un programme tombe en erreur car il manque des classes dans le classpath d’exécution. Jusqu’à présent, je me suis toujours arrangé pour retrouver les artefacts (jar) contenant les classes manquant avec de l’expérience et surtout de la change.
Maintenant c’est fini ! Je viens de découvrir le site internet findjar. Grâce à lui, je retrouve facilement les artefacts contenant ma classe absente !
En utilisant la nouvelle version du plugin Eclipse m2eclipse, je me suis rendu compte que l’extension SCM n’existait plus. Ou bien n’est pas encore développée dans la version actuelle (0.12). Voici comment faire pour créer manuellement tous les projets Eclipse correspondants aux sous-module d’un projet multimodule :
- Récupérer le projet père du SCM (Check out simple)
- Importer les projets maven existant : File -> Import… -> Existing Maven projects
- Sélectionner les modules qui vont faire l’objet d’un projet dans Eclipse
J’utilise le plugin Eclipse m2eclipse pour développer mes applications avec Maven. Lors que l’on travaille sur des projets complexes avec plusieurs sous modules, il faut absolument dissocier les modules en projets Eclipse dissociés pour que les classpaths soient bien respectés. C’est pour cela que je me suis souvent demandé comment transformer un projet Maven multi-modules en plusieurs petits projets Maven dans Eclipse. Jusqu’à maintenant, je me suis débrouillé en utilisant la fonctionnalité “Check out as Maven projet…” (extention SVN du plugin m2eclipse), mais cela implique qu’il faille utiliser un projet enregistré sur un serveur de gestion de configuration. Voici comment faire dans le cas sans gestion de configuration :
Créer son projet multi-module
Avec le wizard de création de projet : File -> New -> Project…, créer un nouveau projet Maven puis cocher la case “Create simple project (skip archetype selection)” puis remplir le formulaire suivant :

Le fichier pom.xml doit être généré de la sorte :
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<version>0.0.1-SNAPSHOT</version>
<artifactId>app-root</artifactId>
<packaging>pom</packaging>
</project>
Pour construire un ou plusieurs sous module, il faut ouvrir le pom.xml avec l’éditeur pour de fichier POM et cliquer sur l’icone “New module project”. Cette fonctionnalité existe aussi à partir du menu contextuel de la vue “Project explorer”. Voici ce que nous avons pour l’instant :

Matérialiser ses projets Maven
Pour cela il faut importer le sous module comme un nouveau projet : File -> Import... Sélectionner ensuite “Materialize Maven Project”, enfin sélectionner le projet que nous avons créer ci dessus dans la boite de dialogue suivante. Voici le résultat dans eclipse :

Après cette opération vous avez bien tous les sous modules sous la forme de projet Eclipse dissociés.
Aujourd’hui, j’ai constaté un comportement étrange de Maven. Mon installation de maven pointe sur un repository nexus interne en local. Le groupe public de Nexus contient le repository des plugins snapshot d’apache.
Lorsque Maven essaie de récupérer un plugin comme maven-scm-plugin Nexus lui propose la dernière version snapshot. Cependant mon projet Maven n’est pas configuré pour accepter les versions snapshots. Le message d’erreur qui suit, annonce que le plugin n’est pas trouvé avec le numéro de version correspondant à la dernière version snapshot existante.
Pour corriger le problème, il faut seulement supprimer le repository snapshot du group public de Nexus. La bonne pratique à en déduire est de ne jamais mettre des versions snapshots dans un repository ayant des versions non snapshots.
Information complémentaire : Pour savoir comment activer les versions snapshots dans un projet Maven : http://maven.apache.org/guides/development/guide-testing-development-plugins.html