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,

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

3 Responses to “Projets multi-module importés en double sous eclipse”

  1. Anthony says:

    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/

  2. Stéphane Malbéqui says:

    Salut Eric,

    normalement il faut également spécifier le path relatif du parent dans le pom des modules.

    <parent>
    	<groupId>guide.ide.eclipse</groupId>
    	<artifactId>guide-ide-eclipse</artifactId>
    	<version>0.1-SNAPSHOT</version>
    	<relativePath>../..</relativePath> 
    </parent>

    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

  3. @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.

Leave a Reply