Maven Modules + construction D'un seul Module spécifique

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

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

j'aimerais pouvoir package une guerre pour le projet B , mais quand j'exécute la commande package à partir du répertoire de B , il se plaint de ne pas trouver les dépendances de A .

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

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

  2. dois-je installer des instantanés de A dans mon dépôt local chaque fois que je veux empaqueter B ?

ce second scénario n'est pas très amusant alors que A est encore en développement.

bonnes pratiques ici?

259
demandé sur Community 2009-07-11 20:12:05

5 réponses

bonnes pratiques ici?

Utiliser le Maven réacteur avancé les options , 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 tout simplement cd dans le répertoire P parent et exécuter:

mvn install -pl B -am

et cela construira B et les modules requis par B.

514
répondu Pascal Thivent 2010-10-10 09:33:44

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

mvn package n'installera rien dans votre dépôt local.il ne fait que empaqueter le projet et le laisse dans le dossier cible.

Do 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 avez juste besoin de compiler/empaqueter le sous-module (B) et Maven prendra le déjà empaqueté 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.

8
répondu victor hugo 2009-07-11 16:53:58

si vous avez déjà lancé mvn install sur le projet B, il aura été installé sur votre dépôt local, Donc lorsque vous construisez un paquet Un Maven peut résoudre la dépendance. Aussi longtemps que vous installerez le projet B à chaque fois que vous le modifiez, vos constructions pour le projet A seront à jour.

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

il est également intéressant de mentionner m2eclipse , il intègre Maven dans Eclipse et vous permet (optionnellement) de résoudre des dépendances à partir de l'espace de travail. Donc si vous êtes en train de pirater plusieurs projets, le contenu de l'espace de travail sera utilisé pour la compilation. Une fois que vous êtes satisfait de vos modifications, Lancez mvn install (sur chaque projet à tour de rôle, ou en utilisant un agrégateur) pour les mettre dans votre dépôt local.

7
répondu Rich Seller 2017-01-27 05:11:31

regardez ma réponse modules Maven et dépendants .

le Maven Reactor plugin est conçu pour traiter de la construction d'une partie d'un projet.

le but particulier que vous voudrez l'utiliser reactor:make .

5
répondu deterb 2017-05-23 11:54:59

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 agrégateur projet P. pour le cas où vous voulez travailler avec A et B (mais ne pas veulent C), vous devez créer agrégateur projet Q.

Modifier 2016 : L' l'information ci-dessus était peut-être pertinente en 2009. À partir de 2016, je recommande fortement de ne pas tenir compte de ce fait dans la plupart des cas, et d'utiliser simplement les options 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 à v2.1, change that first :)

2
répondu Zac Thompson 2016-07-26 18:18:21