Projets multi-module importés en double sous eclipse

Publié par Éric Le Merdy

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,

  1. Créez un répertoire qui va contenir la structure des projets:
    $ mkdir multi-module-eclipse/
    $ cd multi-module-eclipse/
  2. Créez un projet avec le plugin maven archetype:
    $ mvn archetype:create -DgroupId=guide.ide.eclipse -DartifactId=guide-ide-eclipse
  3. Ouvrez eclipse en choisissant le répertoire multi-module-eclipse comme espace de travail.
  4. 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-eclipse du projet précédemment créé avec l'archetype.
    Vous devriez voir le projet maven dans le workspace.
  5. Supprimez le répertoire /src
  6. Changez la nature du projet guide-ide-eclipse de jar à pom dans le fichier pom.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
  7. 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
  8. Après un rafraichissement du projet dans eclipse, ce module a été automatiquement référencé dans le pom:
      
        guide-ide-eclipse-core
      
    
    Et le parent aussi:
      
        guide-ide-eclipse
        guide.ide.eclipse
        1.0-SNAPSHOT
      

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 :

  
    ../sub-modules/guide-ide-eclipse-core
  

Sans oublier de changer la référence au projet parent dans le pom.xml du sous-module :

  
    guide.ide.eclipse
    guide-ide-eclipse
    0.1-SNAPSHOT
    ../.. 
  

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.