Projets multi-module importés en double sous eclipse
Publié le 26/07/2012, par Eric Le Merdy dans Java | 3 Commentaires
Si vous êtes habitués à utiliser maven et eclipse, vous avez peut-être remarqué qu’un agencement standard de projets multi-module provoque un multiple référencement des resources dans les projets eclipse.

Ainsi, lorsque vous faites des recherches dans le workspace, vous obtenez trop d’occurences pour une même resource. De plus, la recherche est d’autant plus longue que les resources sont indéxées de multiples fois.

Reproduire le problème
Pour reproduire le problème,
- Créez un répertoire qui va contenir la structure des projets:
$ mkdir multi-module-eclipse/ $ cd multi-module-eclipse/
- Créez un projet avec le plugin maven archetype:
$ mvn archetype:create -DgroupId=guide.ide.eclipse -DartifactId=guide-ide-eclipse
- Ouvrez eclipse en choisissant le répertoire
multi-module-eclipsecomme espace de travail. - Importez votre projet maven avec l’assistant
Existing maven project.
Si vous ne voyez pas cet assistant, alors installez le plugin eclipse
m2eà l’aide de l’assistant: Menu:Help>Install New Software...Choisissez le repertoire
guide-ide-eclipsedu projet précédemment créé avec l’archetype.
Vous devriez voir le projet maven dans le workspace. - Supprimez le répertoire
/src - Changez la nature du projet
guide-ide-eclipsedejaràpomdans le fichierpom.xml.
Un avertissement signifie que le projet eclipse doit être mis à jour car un chagement du modèle du projet a été effectué. Pour corriger, faites un bouton droit sur le projet, puis Menu:Maven>Update Project...>OK - Depuis la ligne de commande, créez un module:
$ cd guide-ide-eclipse $ mvn archetype:create -DgroupId=guide.ide.eclipse.core -DartifactId=guide-ide-eclipse-core
- Après un rafraichissement du projet dans eclipse, ce module a été automatiquement référencé dans le pom:
<modules> <module>guide-ide-eclipse-core</module> </modules>
Et le parent aussi:
<parent> <artifactId>guide-ide-eclipse</artifactId> <groupId>guide.ide.eclipse</groupId> <version>1.0-SNAPSHOT</version> </parent
Le problème est reproduit. Si vous faites une recherche texte de “Hello World!” dans le workspace, alors vous trouvez deux occurences:
- une pour le projet parent qui inclus le sous-module dans le système de fichier,
- et l’autre pour le module qui est référencé comme un projet maven dans le workspace.
Une solution possible
Il est possible de garder une structure de projets hiérarchisés dans le système de fichier mais sans multiple occurences dans eclipse.
Le principe est de construire des répertoires intermédiaires:
$ cd ../ $ mkdir sub-modules |
Puis de déplacer le sous-module dans le répertoire ainsi créé.
$ mv guide-ide-eclipse/guide-ide-eclipse-core/ sub-modules/ |
Ensuite, il faut changer la référence du module dans le pom.xml du projet parent guide-ide-eclipse :
<modules> <module>../sub-modules/guide-ide-eclipse-core</module> </modules> |
Sans oublier de changer la référence au projet parent dans le pom.xml du sous-module :
<parent> <groupId>guide.ide.eclipse</groupId> <artifactId>guide-ide-eclipse</artifactId> <version>0.1-SNAPSHOT</version> <relativePath>../..</relativePath> </parent> |
On obtient une nouvelle structure:
Avant: Après:
. .
└── guide-ide-eclipse ├── guide-ide-eclipse
├── guide-ide-eclipse-core │ └── pom.xml
│ └── pom.xml └── sub-modules
└── pom.xml └── guide-ide-eclipse-core
└── pom.xml
Conclusion
Si vous refaites une recherche texte, la ressource ne se retrouve donc indexée qu’une seule fois dans le projet qui la contient. Sur un gros projet, nous avons appliqué ce refactoring.
Avantages
- Complétude du workspace. Tous les projets maven sont à nouveau présents dans nos workspace alors qu’avant, on avait tendance à ne pas les ajouter pour éviter cette lourdeur de multiple présence des resources dans le workspace. Le temps de modification d’un pom parent est plus rapide puisqu’il se trouve déjà dans le workspace.
- Performance. Les recherches sont à nouveau rapides (on commençait à avoir la honte face à IntelliJ)
Inconvénients
- On sort de l’agencement standard avec des répertoires intermédiaires. La conséquence est que la navigation à la ligne de commande est un peu moins rapide.
Salut Éric,
effectivement, c’est assez agaçant de voir 2 fois le même fichier au sein d’une même recherche …
Ce que je fais d’habitude, je démarre ma recherche sur un module en particulier (ctrl+h sur le module)
Cependant, tu peux aussi demander à m2e de cacher les répertoires des sous modules d’un parent, dans préférences->Maven->Hide folders of physically nested modules (experimental)
N’oublie pas de supprimer et ré importer tes modules après avoir activée cette option, je viens de tester, çà a supprimé des résultats de ma recherche les occurrences du module parent.
Plus de détails sur le forum de m2e : http://www.eclipse.org/forums/index.php/t/8741/
Salut Eric,
normalement il faut également spécifier le path relatif du parent dans le pom des modules.
Pour mettre en défaut le pom du module sans le relativePath :
- supprime de ton repo maven les artefacts précédemment installés, un clean ne suffit pas
- un mvn clean install devrait remonter le problème suivant : Non-resolvable parent POM: Could not find artifact xxxxx:xxx:pom:0.1-SNAPSHOT and ‘parent.relativePath’ points at wrong local POM
Stéphane
@Anthony, oui, un collègue m’a montré ça aussi. Ca devrait éviter de mofier ainsi le standard layout !
@Stéphane: bien vu, j’ai ajouté cette étape à l’article.