[Maven] Construire un WAR à partir de 2 projets

Coucou les guiques,

Bon, je doute qu’il y ait beaucoup de réponse à ma question, mais je la pose quand même (sait-on jamais, des fois qu’il y ait des experts Maven ici) :

Je précise que je suis loin d’être un expert en Maven. J’utilise Maven 2 ici.
Voilà mon problème :

J’ai un premier projet, appellons-le fondations par exemple.
Il s’agit d’une webapp. Créer le .WAR n’est pas très complexe avec Maven, voilà le début de mon fichier pom.xml :

<project> <modelVersion>4.0.0</modelVersion> <groupId>romain</groupId> <artifactId>fondations</artifactId> <packaging>war</packaging> <name>Projet Fondations</name> <version>1.0</version> ... <build> ... <finalName>fondations</finalName> </build> </project>

Pour faire simple, j’ai zappé les parties concernant les dépendences et quelques autres informations.

Donc quand je fais mvn package, j’obtiens au final le fichier fondations/target/fondations.war.

Maintenant, et c’est là que les choses se gâtent, j’ai un deuxième projet, appellons-le maison.
Le principe c’est que maison construit un WAR à partir du squelette de WAR créé par fondations.
Donc l’idéal pour moi, serait que lorsque je demande de faire maison.war, Maven procède comme suit:

  1. Il compile le projet fondations.
  2. Il crée le fichier fondations.war, qui contient les sources compilées de fondations ainsi que tous les fichiers de ce projet (JSP, html, XML, images, etc.)
  3. Il “dézippe” le fondations.war dans maison/target/, et y ajoute tous les fichiers (Java, JSP, html, XML, images, etc.) de maisons.
  4. Il recompile l’ensemble dans un fichier maison.war.

(à la limite, si je peux me passer de l’étape de compression des fichiers du projet fondations en .war, ce serait pas mal).

Donc pour répondre à ce problème, je me suis dit qu’il fallait sans doute définir le projet fondations comme parent du projet maison… Est-ce que cela résoudra effectivement mon problème ?
Si oui, comment dois-je écrire mon fichier pom.xml pour le projet maison ?
Voilà ce que j’ai tenté pour l’instant (mais qui ne marche pas, vous vous en doutez) :

<project> <modelVersion>4.0.0</modelVersion> <groupId>romain</groupId> <artifactId>maison</artifactId> <parent> <groupId>romain</groupId> <artifactId>fondations</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>d:/dev/fondations/</relativePath> </parent> <packaging>war</packaging> <version>1.0</version> <name>Projet Maison</name> ... <dependencies> <dependency> <groupId>romain</groupId> <artifactId>fondations</artifactId> <version>1.0</version> <type>pom</type> </dependency> ... </dependencies> ... </project>

Merci pour votre aide.

Vais tenter de t’aider un peu !
2 ans que j’utilise Maven intensivement, mais je ne suis pas encore passé à Maven2 (que visiblement tu utilises), donc je ne vais malheureusement pas pouvoir bcp rentrer dans les détails. Juste qq conseils :

  • Maven est un outil assez contraignant (il impose bcp de choses sur le packaging des projets, l’organisation des sources …). Quand on essaie de sortir de ce cadre (je pense qu’ici c’est le cas), ca peut couter cher.
  • L’héritage entre 2 projets ne te permettra pas de résoudre ton problème, ca sert juste à mutualiser de la conf de tes projets, pas les artifacts générés
  • L’interaction entre 2 projets distincts doit se faire par le biais du repository : il ne faut pas que le projet Maison utilise le war contenu ds le répertoire target du projet fondation, il faut qu’il récupère ce war depuis le repository
    -Je ne pense pas que ton problème puisse etre résolu juste par une bonne configuration dans le project.xml, il faut écrire un goal particulier (attention, ca a du considérablement changer dans Maven2, je dis ptet des conneries) : dans maven1, j’aurais créé un postgoal de war:webapp qui décompresse le war fondation dans le répertoire maison/target/maison

Pour info, dans maven1 pour créer un war on tapait maven war:war (exécute le goal war:war qui crée le fichier target/maison.war). Le goal war:war dépend du goal war:webapp qui crée le répertoire target/maison (càd le war avant d’etre zippé). Maven offrait un mécanisme d’interception (pregoal et postgoal) permettant d’exécuter un bout de script (en jelly, un langage propriétaire de merde) avant ou après n’importe quel goal.

Dans maven2, la gestion des builds a été largement améliorée, et toute ces concepts sont bien plus générique : désormais on parle de “build lifecycle”. Tu dois regarder de ce côté là pour voir comment intégrer une étape custom (= je dezip un war du repository dans mon répertoire target/maison) dans ton build

Bon courage !

Bon, mon problème avait été résolu. On a en fait développé un plugin Maven tout simple dont le rôle est de récupérer un WAR (depuis le repository distant ou local), et de le dézipper dans le répertoire target/ du 2e projet.
Du coup, ça fait ce que ça doit faire :stuck_out_tongue:

Sinon, ouais, c’est clair qu’il y a eu des modifs entre Maven1 et 2. Je te conseille d’y jeter un oeil, ne serait-ce que pour le gain (énorme) des dépendances transitives…