457 votes

Modules Maven + Construction d'un module spécifique unique

J'ai un projet Maven multi-module avec un projet parent. P et trois sous-modules A , B et C . Les deux sites B y C sont des projets de guerre et tous deux dépendent de A .

Je peux taper mvn compile sur P et avoir tous les sous-modules correctement compilés. Le problème vient lorsque je veux faire des opérations pour des modules spécifiques.

J'aimerais pouvoir emballer une guerre pour le projet. B mais lorsque je lance la commande de paquetage à partir de B il se plaint qu'il ne peut pas trouver les dépendances pour A .

Je comprends de cette question : Maven et les modules dépendants que Maven n'est peut-être pas vraiment conçu pour ce type de résolution de dépendances, mais cela soulève la question de savoir comment empaqueter B ?

  1. Est-ce que je dois courir mvn package pour toute la hiérarchie du projet alors que je veux juste B ?

  2. Dois-je installer des instantanés de A dans mon référentiel local à chaque fois que je veux empaqueter B ?

Ce deuxième scénario n'est pas très amusant lorsque A est toujours en cours de développement.

Quelles sont les meilleures pratiques en la matière ?

808voto

Pascal Thivent Points 295221

Quelles sont les meilleures pratiques en la matière ?

Utilisez le Options du réacteur avancé Maven et plus particulièrement :

-pl, --projects
        Build specified reactor projects instead of all projects
-am, --also-make
        If project list is specified, also build projects required by the list

Donc juste cd dans le répertoire P parent et exécutez :

mvn install -pl B -am

Et cela permettra de construire B et les modules requis par B.

Notez que vous devez utiliser les deux-points si vous faites référence à un fichier de type artifactId qui diffère du nom du répertoire :

mvn install -pl :B -am

Comme décrit ici :

16 votes

Pour ceux qui consultent cette page en 2011, c'est la meilleure réponse. Il y a maintenant un meilleur support pour les multi-modules dans maven lui-même (Maven 2.1 et plus), vous n'avez pas besoin d'utiliser le plugin reactor.

19 votes

Une autre option très utile est "-amd, --also-make-dependents", qui construit tous les modules dépendants des projets dans la liste des réacteurs.

2 votes

Pourquoi ne pas construire un module petit-enfant ?

10voto

victor hugo Points 16700

Maven a été absolument conçu pour ce type de dépendance.

mvn package n'installe rien dans votre dépôt local, il empaquette simplement le projet et le laisse dans le dossier cible.

Faites mvn install dans le projet parent (A), avec cela tous les sous-modules seront installés dans le dépôt Maven de votre ordinateur, s'il n'y a pas de changements vous devez juste compiler/empaqueter le sous-module (B) et Maven prendra les dépendances déjà emballées et installées juste comme il faut.

Il vous suffit d'un mvn install dans le projet parent si vous avez mis à jour une partie du code.

5 votes

Ce serait un cauchemar pendant le développement, car une fois que vous avez fait un correctif dans le sous-module, vous devez l'installer, et ensuite vous démarrez le conteneur de servlet. La vie est courte :(

9voto

Rich Seller Points 46052

Si vous avez précédemment exécuté mvn install sur le projet B, il aura été installé dans votre dépôt local, de sorte que lorsque vous construisez le paquet A, Maven peut résoudre la dépendance. Ainsi, tant que vous installez le projet B chaque fois que vous le modifiez, vos constructions pour le projet A seront à jour.

Vous pouvez définir un projet multi-module avec un pom agrégateur pour construire un ensemble de projets.

Il convient également de mentionner m2eclipse Il intègre Maven dans Eclipse et vous permet (en option) de résoudre les dépendances à partir de l'espace de travail. Ainsi, si vous travaillez sur plusieurs projets, le contenu de l'espace de travail sera utilisé pour la compilation. Une fois que vous êtes satisfait de vos modifications, exécutez mvn install (sur chaque projet à son tour, ou en utilisant un agrégateur) pour les placer dans votre dépôt local.

2 votes

Existe-t-il un moyen simple de garantir que tous les projets dépendants de mon projet cible ont été installés ? La hiérarchie que j'ai est en fait beaucoup plus complexe que celle décrite ici, donc essayer de se rappeler si j'ai exécuté mvn install pour chaque projet dépendant depuis la dernière modification du code pourrait être délicat.

0 votes

Oui, en utilisant des modules pour construire l'ensemble des projets, voir le lien ajouté à la réponse originale.

5voto

deterb Points 2317

Jetez un coup d'œil à ma réponse Maven et les modules dépendants .

El Plugin Maven Reactor est conçu pour traiter la construction d'une partie d'un projet.

L'objectif particulier dans lequel vous souhaitez l'utiliser reactor:make .

5 votes

C'était la bonne réponse, mais avec Maven 2.1, vous n'avez plus besoin d'utiliser le plugin reactor. Regardez la réponse de Pascal dans ce fil de discussion concernant les "Options avancées de Reactor".

4voto

Zac Thompson Points 7754

Vous dites que vous "ne voulez vraiment que B", mais c'est faux. Vous voulez B, mais vous voulez aussi un A mis à jour s'il a été modifié ("développement actif").

Donc, parfois vous voulez travailler avec A, B et C. Pour ce cas, vous avez le projet d'agrégateur P. Pour le cas où vous voulez travailler avec A et B (mais ne pas veulent C), vous devez créer le projet d'agrégateur Q.

Edit 2016 : Les informations ci-dessus étaient peut-être pertinentes en 2009. À partir de 2016, je recommande fortement de l'ignorer dans la plupart des cas, et d'utiliser simplement l'option -am o -pl comme décrit dans la réponse acceptée. Si vous utilisez une version de maven antérieure à la v2.1, changez-la d'abord :)

2 votes

Grmphh... alors je vais me retrouver avec autant de projets d'agrégateurs que de projets.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X