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

384

J'ai un projet Maven multimodule avec un projet parent Pet trois sous-modules A, Bet C. Les deux Bet Csont des projets de guerre et dépendent tous les deux A.

Je peux taper mvn compiledans Pet ont tous les sous-modules correctement compilés. Le problème survient lorsque je veux effectuer des opérations pour des modules spécifiques.

J'aimerais pouvoir empaqueter un war pour project B, mais quand j'exécute la commande package depuis Ble répertoire de, il se plaint de ne 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épendance, mais cela pose la question de savoir comment créer un package B?

  1. Dois-je courir mvn packagepour toute la hiérarchie du projet quand je le veux vraiment B?

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

Ce deuxième scénario n'est pas très amusant lorsqu'il Aest encore en développement actif.

Des bonnes pratiques ici?

Brian Ferris
la source
doublon possible de Maven et des modules dépendants
oberlies

Réponses:

696

Des bonnes pratiques ici?

Utilisez les options avancées du réacteur Maven , plus précisément:

-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 cddans le répertoire P parent et exécutez:

mvn install -pl B -am

Et cela va construire B et les modules requis par B.

Notez que vous devez utiliser deux points si vous faites référence à un artifactIdqui diffère du nom du répertoire:

mvn install -pl :B -am

Comme décrit ici: https://stackoverflow.com/a/26439938/480894

Pascal Thivent
la source
15
Pour tous ceux qui ont visité 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 supérieur), vous n'avez pas besoin d'utiliser le plugin réacteur.
Spedge
17
Une autre option très utile est "-amd, --also-make-dependents", qui construit tous les modules dépendant des projets dans la liste des réacteurs.
deterb
1
Qu'en est-il de la construction d'un module petit-enfant?
Bax
12
@Bax, utilisez mvn install -pl .,parent/child,parent/child/grandchild Utiliser une virgule pour séparer plusieurs projets et. pour parent pom
Neo
1
Lorsque j'essaie clean packageun module de cette façon, il ne peut pas résoudre les dépendances du réacteur qui ne sont pas encore installées. Avec -amcela va reconstruire inutilement les deps.
bassin
18

Say Parent pom.xml contient 6 modules et que vous souhaitez exécuter A , B et F .

<modules>
        <module>A</module>
        <module>B</module>
        <module>C</module>
        <module>D</module>
        <module>E</module>
        <module>F</module>
  </modules>

1- cd dans le projet parent

 mvn --projects A,B,F --also-make clean install

OU

mvn -pl A,B,F -am clean install

OU

mvn -pl A,B,F -amd clean install

Remarque: Lorsque vous spécifiez un projet avec l' option -am , Maven construira tous les projets dont dépend le projet spécifié (directement ou indirectement). Maven examinera la liste des projets et parcourra l'arborescence des dépendances, en trouvant tous les projets dont il a besoin pour construire.

Alors que la commande -am crée tous les projets requis par un projet particulier dans une génération multi-module, l' option -amd ou --also-make-dependents configure Maven pour construire un projet et tout projet qui dépend de ce projet. Lors de l'utilisation de --aussi faire des dépendants , Maven examinera tous les projets dans notre réacteur pour trouver des projets qui dépendent d'un projet particulier. Il construira automatiquement ces projets et rien d'autre.

Waqas Ahmed
la source
8

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

mvn package n'installera rien dans votre dépôt local, il empaquetera simplement le projet et le laissera dans le dossier cible.

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

Vous avez juste besoin d'un mvn installdans le projet parent si vous avez mis à jour une partie du code.

Victor Hugo
la source
3
Ce serait un cauchemar pendant le développement, image qu'une fois que vous aurez fait un correctif dans le sous-module, vous devrez l'installer, puis vous démarrez le conteneur de servlet. La vie est courte :(
hguser
7

Si vous avez déjà exécuté mvn install sur le projet B, il aura été installé dans votre référentiel local, donc lorsque vous créez le package A, Maven peut résoudre la dépendance. Donc, tant que vous installez le projet B à chaque fois que vous le modifiez, vos versions du projet A seront à jour.

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

Il vaut également la peine de mentionner m2eclipse , il intègre Maven dans Eclipse et vous permet (éventuellement) de résoudre les dépendances à partir de l'espace de travail. Donc, si vous piratez 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 à tour de rôle ou à l'aide d'un agrégateur) pour les placer dans votre référentiel local.

Vendeur riche
la source
1
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 réalité beaucoup plus complexe que celle décrite ici, alors essayez de vous rappeler si j'ai exécuté mvn install pour chaque projet dépendant depuis que j'ai fait des modifications de code pour la dernière fois, cela pourrait être délicat.
Brian Ferris
Oui, en utilisant des modules pour construire l'ensemble de projets, voir le lien ajouté à la réponse d'origine.
Rich Seller
5

Jetez un oeil à ma réponse Maven et modules dépendants .

Le plugin Maven Reactor est conçu pour gérer la construction d'une partie d'un projet.

L'objectif particulier que vous voudrez l'utiliser reactor:make.

deterb
la source
3
C'était la bonne réponse, mais avec Maven 2.1, vous n'avez plus besoin d'utiliser le plugin de réacteur. Regardez la réponse de Pascal dans ce fil concernant les "Options avancées des réacteurs"
Spedge
3

Vous dites que vous "voulez vraiment juste B", mais c'est faux. Vous voulez B, mais vous voulez aussi un A mis à jour s'il y a eu des changements ("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 voulez pas 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 d'ignorer cela dans la plupart des cas, et simplement d'utiliser les indicateurs de ligne de commande -amou -plcomme décrit dans la réponse acceptée. Si vous utilisez une version de maven antérieure à la v2.1, changez-la d'abord :)

Zac Thompson
la source
Grmphh ... alors je vais me retrouver avec autant de projets agrégateurs que de projets.
Kris
@Kris, je ne recommanderais plus cela. Je vais le laisser ici au cas où quelqu'un voudrait toujours savoir comment, mais j'utilise toujours les drapeaux -am et -pl maintenant. J'ai mis à jour ma réponse.
Zac Thompson