J'ai un projet Maven multimodule avec un projet parent P
et trois sous-modules A
, B
et C
. Les deux B
et C
sont des projets de guerre et dépendent tous les deux A
.
Je peux taper mvn compile
dans P
et 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 B
le 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
?
Dois-je courir
mvn package
pour toute la hiérarchie du projet quand je le veux vraimentB
?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 A
est encore en développement actif.
Des bonnes pratiques ici?
la source
Réponses:
Utilisez les options avancées du réacteur Maven , plus précisément:
Donc, juste
cd
dans le répertoire P parent et exécutez: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
artifactId
qui diffère du nom du répertoire:Comme décrit ici: https://stackoverflow.com/a/26439938/480894
la source
mvn install -pl .,parent/child,parent/child/grandchild
Utiliser une virgule pour séparer plusieurs projets et. pour parent pomclean package
un 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-am
cela va reconstruire inutilement les deps.Say Parent pom.xml contient 6 modules et que vous souhaitez exécuter A , B et F .
1- cd dans le projet parent
OU
OU
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.
la source
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 install
dans 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 install
dans le projet parent si vous avez mis à jour une partie du code.la source
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.
la source
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
.la source
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
-am
ou-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 :)la source