web-dev-qa-db-fra.com

Maven Modules + 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. B et C sont des projets de guerre et dépendent tous deux de A.

Je peux taper mvn compile dans P et avoir tous les sous-modules correctement compilés. Le problème survient lorsque je souhaite effectuer des opérations sur des modules spécifiques.

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

Je comprends de cette question: Maven et 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 je package B?

  1. Dois-je exécuter mvn package pour l’ensemble de la hiérarchie du projet lorsque je ne souhaite que 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 quand A est encore en développement actif.

Des meilleures pratiques ici?

324
Brian Ferris

Des meilleures pratiques ici?

Utilisez le Maven options de réacteurs avancées , plus spécifiquement:

-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

Il suffit donc de cd dans le répertoire parent P et d’exécuter:

mvn install -pl B -am

Et cela construira B et les modules requis par B.

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

mvn install -pl :B -am

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

603
Pascal Thivent

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

mvn package n'installera rien dans votre référentiel local, il empaquetera simplement le projet et le laissera dans le dossier cible.

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

Vous devez simplement indiquer un mvn install dans le projet parent si vous avez mis à jour une partie du code.

8
victor hugo

Si vous avez déjà exécuté mvn install sur le projet B, il aura été installé sur votre référentiel local. Ainsi, lorsque vous construisez 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 agrégateur pour construire un ensemble de projets.

Il convient également de mentionner m2Eclipse , il intègre Maven dans Eclipse et vous permet (facultativement) 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, ou à l'aide d'un agrégateur) pour les mettre dans votre référentiel local.

7
Rich Seller

Disons que Parent pom.xml contient 6 modules et que vous voulez 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

OR

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

OR

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

Remarque: Lorsque vous spécifiez un projet avec l'option - am, Maven crée tous les projets dont dépend le projet spécifié (directement ou indirectement). Maven examinera la liste des projets et parcourra l’arbre des dépendances afin de trouver tous les projets qu’il doit construire.

Bien que la commande - am rend tous les projets requis par un projet particulier dans une construction multi-module, le - AMD ou - also-make- dépendants L’option configure Maven pour construire un projet et tout projet dépendant de ce projet. Lors de l'utilisation de - also-make-dependents, Maven examinera tous les projets de notre réacteur pour rechercher des projets qui dépendent d'un projet particulier. Il construira automatiquement ces projets et rien d'autre.

5
Waqas Ahmed

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

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

L’objectif particulier que vous voudrez utiliser reactor:make.

5
deterb

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 a été modifié ("développement actif").

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

Edit 2016: Les informations ci-dessus étaient peut-être pertinentes en 2009. À partir de 2016, je recommande vivement de ne pas en tenir compte dans la plupart des cas et d'utiliser simplement la ligne de commande -am ou -pl drapeaux comme décrit dans la réponse acceptée. Si vous utilisez une version de maven antérieure à la v2.1, commencez par la modifier :)

3
Zac Thompson