Question

Je sais qu'il est ton mauvais demander deux fois en une seule journée, mais voici une autre Maven puzzler:

I ai un POM parent qui définit 5 modules (5) sous-projets. Étant donné que chaque module est exécuté exactement de la même façon que je tire la section <profile><build> dans le POM parent pour se débarrasser du code en double. Maintenant - si j'exercerai construire individuellement à partir de chaque module, il fonctionne, si je veux construire tous les modules à la fois et passer au répertoire parent que je suis erreur depuis la première chose que Maven tente d'exécuter le projet parent lui-même:

mvn package -P release
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   DWD Parent project
[INFO]   Projects

Après cette génération échoue parce que le plugin exec tente d'exécuter quelque chose qui est pas là. En regardant la sortie, il est assez évident que plug-in du réacteur est le moteur de la construction, mais comment puis-je configurer réacteur pour sauter le parent?

P.S. Pour éviter toute confusion - Je suis en train de supprimer l'exécution sur le profil parent et l'activer sur l'enfant lors de la construction de same

Était-ce utile?

La solution

Quel est le problème en construisant le parent?

En fait, dans Maven, il existe deux concepts différents (qui sont généralement utilisés en même temps):

  • Le POM parent
  • L'agrégation des modules

La première est une définition de tout ce qui est commun avec tous les enfants. Vous définissez un parent comme un projet emballé pom, et vous pouvez l'installer dans votre répertoire.

Lorsque vous construisez un enfant de ce parent, Maven2 récupérera ce parent de fusionner la pom-mère avec l'enfant pom. Vous pouvez jeter un oeil à l'ensemble pom.xml en exécutant la commande mvn help:effective-pom.

Dans ce cas, la pom-mère ne sera pas construit, il sera simplement récupéré à partir du référentiel.

Le second cas est un projet qui contient une liste de modules de sous-projets. Le principe est que chaque commande que vous exécutez sur ce projet sera également exécuté sur tous les sous-modules. L'ordre des modules sera défini par le réacteur, qui se penchera sur les dépendances inter-modules pour trouver le module doit être construit avant les autres. S'il n'y a pas de dépendances, il prendra la liste des modules tels qu'ils sont définis dans le pom.xml parent.

Dans ce cas, si vous exécutez une commande sur le projet racine, Maven2 d'abord construit le projet racine, puis les sous-modules. Vous ne peut pas sauter la création du projet racine.


Modifier, grâce à un commentaire de RichSeller

Une explication complète des différences entre les multi-modules (projet d'agrégation) et l'héritage (projet parent) se trouve dans le livre Maven, ici .

Autres conseils

Vous ne pouvez pas ignorer la génération parent, mais vous pouvez configurer le profil pour ne pas être activé avec un petit hack. Cette réponse montre comment contrôler l'activation d'un profil par la présence ou l'absence d'un élément de <activation> basé sur un fichier. De cette façon, vous pouvez définir le profil du parent, mais avoir désactivé dans ce projet en raison du fichier marqueur étant présent dans le parent. projets d'enfants ne seraient pas avoir le fichier marqueur dans la source, de sorte que le profil serait activé pour ces projets.

Mise à jour pour clarifier: cette configuration signifie que le profil est désactivé dans le projet parent (qui a le fichier src / main / ressources), mais activé dans tous les projets d'enfants qui ne sont pas sur mon projet de test du fichier dans leurs ressources répertoires.

<profile>
  <id>test</id>
  <activation>
    <file>
      <missing>src/main/resources/test.marker</missing>
    </file>
  </activation>
  ...
</profile>

Je veux documenter qu'il ya compromis partiel à ma situation (grâce aux gars sur les utilisateurs de Maven liste de diffusion pour la suggestion). Fondamentalement, vous devez couper le profil en deux morceaux. Réutilisable section configuration de plug-in va au POM parent, et reste executions chez l'enfant POM. Ensuite, le plugin de profil chez l'enfant est marqué comme inherited et le tour est joué - au profil parent moment de l'exécution n'est pas exécuté car il manque la section executions. Ce qui est loin d'être idéal, mais il fonctionne. Reportez-vous à ce lien par exemple

Je n'ai pas pu mettre en œuvre « manquant » solution de fichier tel que fourni par Rick Vendeur ci-dessus. Il semble qu'une fois mis en état actif / non actif du profil ne sera même pas changé le fichier marqueur est manquant à partir du module (s). Cependant, voici la solution exacte à mon problème. Attention: ceci est uniquement disponible à partir de Maven 2.1 +

Si j'ai un POM parent avec 2 modules définis: foo et boo dans des circonstances bien régulières ordre d'exécution sera:

    parent
  1. foo
  2. boo

Tout ce que je dois faire pour sauter génération parent est d'ajouter ce commutateur de ligne de commande

mvn install –rf foo

Vous pouvez également utiliser --resume-from Qu'est-ce qu'il va faire est de sauter parent et continuer à partir du module foo vers le bas. Maintenant - j'enquête si cela peut être réalisé par la configuration plug-in de réacteur (P.S -. Non, il ne peut pas) mais même avec l'interrupteur, le scénario ci-dessus fonctionne bien pour moi

Ceci est impliqué par la réponse de @ romaintaz à la même question, Maven - sauter projet parent construction

mais juste pour faire de ce explicite, dans le parent pom il est impératif que vous spécifiez l'élément d'emballage pom (et non Jar ou de guerre).
Exemple:

<packaging>pom</packaging>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top