Hello,

Pour faire court, ma question est de savoir quelle est la meilleure façon pour gérer des ressources partagées (type CSS, JavaScript, images) entre plusieurs applications web sous Eclipse.

Maintenant, la version longue

Le contexte

Mon projet est donc divisé en plusieurs modules (au sens Maven), dont plusieurs sont des applications web. Un truc du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
my-project
  + pom.xml
  +-- commons
  +-- persistence
  +-- ...
  +-- web-app-1
  +-- web-app-2
  +-- ...
Toutes ces web apps partagent des ressources communes.
Plutôt que de dupliquer ces ressources (et donc d'oublier de les synchroniser régulièrement), j'ai décidé de créer un nouveau projet, appelé web-resources, qui est également un projet de type WAR.
Ainsi, je me retrouve avec la structure suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my-project
  + pom.xml
  +-- commons
  +-- persistence
  +-- ...
  +-- web-app-1
  +-- web-app-2
  +-- ...
  +-- web-resources
       +-- pom.xml
       +-- src/main/webapp
            +-- web.xml (which is almost empty, just need to be present for Maven)
            +-- web_resources
                 +-- css
                 +-- images
                 +-- javascript
Maven

Avec Maven 2 (ou Maven 3, ça importe peu ici), ce genre de chose est facile à gérer car mes web-apps déclarent juste une dépendance avec le projet web-resources :

Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
<groupId>foo.bar</groupId> <artifactId>web-app-1</artifactId> ... <dependencies> <dependency> <groupId>foo.bar</groupId> <artifactId>web-resources</artifactId> <version>${preclosing-version}</version> <type>war</type> </dependency> ...

De cette façon, quand je builde mes web apps, Maven va d'abord récupérer le web-resources.war tout juste généré, puis va le dézipper, et s'en servir de "squelette" pour la "vraie" web-app.
Ainsi, mon WAR final contiendra un répertoire appelé web_resources/ qui contiendra ces ressources partagées.

C'est le principe du war overlay...

Donc du point de vue Maven, tout est beau !

Eclipse

Maintenant, voilà mon Problème : faire en sorte que ça marche avec Eclipse (quelle idée me direz-vous ).
En effet, mon souci principal est de faire gérer tout cela par Eclipse correctement, et en particulier la phase de déploiement de ma web-app sur Tomcat depuis Eclipse.

L'idéal serait de rendre cette configuration automatique, afin d'éviter toute modification manuelle dans les fichiers de configuration ou de propriétés des projets Eclipse.

Jusqu'à présent, ma solution se base sur les ressources liées d'Eclipse (linked resources). Dans les pom.xml de mes applications web, j'ai mis :

Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <configuration> <wtpversion>1.5</wtpversion> <linkedResources> <linkedResource> <name>web_resources</name> <type>2</type> <location>${project.basedir}\..\web-resources\src\main\webapp\web_resources</location> </linkedResource> </linkedResources> </configuration> </plugin> ...

Dès que je lance mvn eclipse:eclipse, il est ajouté dans mon .project :
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
<projectDescription> ... <linkedResources> <link> <name>web_resources</name> <type>2</type> <location>C:\dev\project\web-resources\src\main\webapp\web_resources</location> </link> </linkedResources> <projectDescription>

Maintenant, j'importe mon projet dans Eclipse.
Le souci est que dans Project properties > Java Build Path > Source, je ne vois pas le "Link Source".
Je ne vois que mes 4 répertoires Maven (src/main/java, src/main/resources, src/test/java et src/test/resources).
C'est d'autant plus étrange que si je souhaite ajouter manuellement une ressource liée, Eclipse refuse en disant que ce répertoire existe déjà !

En l'état, si je déploie mon application web sur Tomcat depuis Eclipse, ce dernier ne déploie pas mon web_resources, et du coup, je n'ai pas mes CSS / JS / images déployées !

Après quelques tests, il apparait que je dois procéder à 2 modifications :


  • Ajouter la ligne <classpathentry kind="src" path="web_resources" output="src/main/webapp/web_resources"/>[/I] dans le fichier [I].classpath ;
  • Supprimer la ligne <project>preclosing-web-resources</project> dans le fichier .project.


Avec ces modifications, Eclipse va copier (et maintenir la synchronisation) le contenu du projet web_resources dans mon web-app-X/src/main/webapp/web_resources.

Donc a fortiori, j'ai bien le résultat attendu, si ce n'est que j'ai dû modifier des choses générées dans les fichiers de configuration d'Eclipse...

Pour être complet, j'ai délaissé cette tâche à un plugin Maven de mon cru, qui est lancé après le plugin "officiel" Eclipse. Ainsi, pour importer un projet sur mon Eclipse, je suis obligé de faire :

mvn eclipse:clean eclipse:eclipse myEclipsePlugin:eclipse

Ma question

Au final, même si cela fonctionne, je trouve cela très lourd. N'y a-t-il rien de mieux pour qu'Eclipse gère cela correctement ?

Une note : oui, je pourrais déployer directement mon projet web_resources, et ne pas livrer ces ressources dans chaque WebApp. Mais j'aimerais autant que possible éviter cette solution.

Informations techniques


  • Java 6
  • Maven 2.2.1
  • Maven Eclipse plugin 2.8
  • Eclipse 3.3.2, mais je prévois d'utiliser bientôt une version plus récente, la 3.6 voire la 3.7...
  • pas de plugin m2eclipse, mais est-ce qu'il me permettrait de gérer les choses plus simplement ?.

Merci d'avance pour vos suggestions !