Maven2 - problème avec pluginManagement et relation parent-enfant
de maven la documentation
pluginManagement: est un élément qui est vu à côté de plugins. Gestion des plugins plugin contient des éléments de la même façon, sauf que plutôt que de la configuration du plugin d'information pour ce projet particulier de construction, il est prévu pour la configuration de projet se construit qui héritent de celle-ci. Toutefois, cela ne configure les plugins qui sont référencées dans les plugins élément dans les enfants. Les enfants ont tout à fait le droit de remplacer pluginManagement définitions.
Maintenant : si j'ai cela dans mes parent POM
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<executions>
Some stuff for the children
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
et je exécuter mvn help:effective-pom sur le projet parent j'obtiens ce que je veux, à savoir les plugins directement en vertu de construire (celui qui fait le travail) reste vide.
Maintenant, si je ne les suivants :
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<executions>
Some stuff for the children
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<inherited>true</inherited>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
mvn help:effective-pom-je obtenir exactement ce que je veux, les plugins contient tout ce qui est déclaré et la pluginManagement section est ignorée.
MAIS en changeant les suivantes
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<executions>
Some stuff for the children
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<inherited>false</inherited> <!-- this perticular config is NOT for kids... for parent only -->
<executions>
some stuff for adults only
</execution>
</executions>
</plugin>
</plugins>
</build>
et d'exécuter mvn help:effective-pom
les trucs de pluginManagement l'article est ajouté au-dessus de ce qui est déclaré déjà. en tant que tel :
<build>
<pluginManagement>
...
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.0</version>
<inherited>false</inherited> <!-- this perticular config is NOT for kids... for parent only -->
<executions>
Some stuff for the children
</execution>
<executions>
some stuff for adults only
</execution>
</executions>
</plugin>
</plugins>
</build>
Est-il un moyen d'exclure la partie pour les enfants à partir du pom parent de l'article ? En effet, ce que je veux c'est pour la pluginManagement à se comporter exactement comme les états de documentation, c'est que je veux qu'il s'applique pour les enfants seulement, mais pas pour le projet dans lequel elle est déclarée.
Comme un corrolary, est-il une manière que je peux remplacer les pièces de la pluginManagement en déclarant le plugin dans la normale construire la section d'un projet ? quoi que j'essaye je reçois ce que la section est ajoutée à des exécutions, mais je ne peut pas remplacer celui qui existe déjà.
EDIT:
Je n'ai jamais fait de trouver une solution acceptable pour cela, et en tant que telle, la question reste ouverte. Plus proche de la solution a été offert ci-dessous et est actuellement la solution retenue pour cette question jusqu'à ce que quelque chose de mieux. Actuellement, il existe trois façons d'obtenir le résultat souhaité (moduler plugin comportement selon l'endroit où dans la hiérarchie d'héritage de l'actuel POM est):
1 - à l'aide de profils, cela va fonctionner, mais vous devez être prudent que les profils ne sont pas héritées, qui est un peu contre-intuitif. Ils sont (si activé) appliquée à la POM où déclarées et puis cela a généré POM est propagée vers le bas. En tant que tel la seule façon d'activer le profil pour enfant POM est précisément sur la ligne de commande (du moins je n'ai pas trouvé d'autre moyen). De la propriété, de fichiers et d'autres moyens d'activation ne parviennent pas à activer le POM parce que le déclencheur n'est pas dans le POM où le profil est déclarée.
2 - (c'est ce que j'ai fait) Déclarer le plugin ne pas hérité de la mère et de re-déclarer (copier-coller) la friandise à chaque enfant là où il voulait. Pas l'idéal, mais c'est simple et ça fonctionne.
3 - Split l'agrégation de la nature et de la mère nature de la POM parent. Ensuite, étant donné que la partie qui s'applique uniquement à la mère est dans un autre projet, il est maintenant possible d'utiliser pluginManagement que tout d'abord prévu. Cependant, cela signifie qu'une nouvelle artificiel projet doit être créé qui ne contribuent pas à la fin un produit, mais qui ne sert pouvait système. C'est bien le cas de conceptuel saigner. Aussi cela ne s'applique qu'à mon spécifiques et il est difficile de généraliser, j'ai donc abandonné les efforts pour essayer de le faire travailler en faveur de la non-jolie, mais plus contenue couper et coller correctif décrit dans la section 2.
Si quelqu'un à venir à travers cette question a une meilleure solution, soit en raison de mon manque de connaissance de Maven ou parce que l'outil a évolué pour permettre à cette s'il vous plaît poster la solution ici pour référence future.
Merci à vous tous pour votre aide 🙂
source d'informationauteur Newtopian | 2009-08-12
Vous devez vous connecter pour publier un commentaire.
Ajout de la configuration du plugin pour pluginManagement signifie que cette configuration sera utilisée si le plugin est déclarée, mais vous avez encore besoin de déclarer le plugin dans le construire de toutes les POM qui veut l'utiliser.
La clé qui explique cette de la section que vous avez cité est:
Donc, si vous faites cela à l'enfant pom la configuration de la mère sera appliquée:
Mise à jour: pour répondre À la question réelle, le contenu de l'pluginManagement section est toujours fusionné avec n'importe quel plugin déclaration. Pour éviter le parent faisant cela, vous pouvez définir la pluginManagement section à l'intérieur d'un profil, et d'activer le profil de l'enfant, des projets mais pas de la mère. L'enfant de projets devra alors déclarer que le profil de l'.
Par exemple:
J'ai toujours l'habitude de penser qu'un enfant POM peut hériter d'une définition d'un plugin à partir de l'un de ses parents pluginManagement section et spécifier seulement les exécutions, il veut courir à partir de ce plugin en les référençant par ID et de liaison de l'exécution d'un phase. Tant que le parent définition est pluginManagement (et non pas directement dans les plugins) et n'est pas lié à une phase, seule l'exécution spécifiques (avec ID) sera exécuté au cours de cette phase.
À la lecture de ce qui précède, et de ma propre problème actuel, il semble que cela n'est pas vrai: il ressemble à un enfant POM va hériter de l'ensemble de la configuration du plugin, y compris toutes les exécutions. En termes d'exécutions, la seule chose que l'enfant peut faire est de remplacer des valeurs spécifiques - il ne peut pas choisir les exécutions à exécuter, et qui ne pas.
Est-ce un bug? Quelle est l'utilité d'être en mesure de lier chaque exécution d'une phase (ou pas), si toutes les exécutions, sera exécuté? J'ai seulement vu avec maven-dépendance-plugin:unpack (lié à paquet phase), mais avec d'autres plugins que j'ai peut-être juste eu de la chance...
Merde.
Dans le pom parent, vous devez configurer les exécutions avec
<goals>
déclarée, mais ne déclarent pas de<phase>
. Ensuite, dans l'enfant pom, vous allez déclarer:Le plugin ne sera pas exécutée jusqu'à ce que vous définissez une phase à l'enfant pom. Ainsi, vous aurez besoin de lier explicitement les exécutions de phases dans chaque enfant pom (ou dans le milieu de la hiérarchie), mais
vous n'aurez pas besoin de copier-coller de la configuration de ces exécutions.
Noter que beaucoup de plugins par Défaut de Phase, par exemple Enforcer Plugin est lié à
validate
par défaut. Même si vous n'engagent pas de plugin à une phase explicitement, il sera lié de toute façon et donc le plugin sera exécuté. Pour surmonter cette difficulté, l'utilisation non-existant phase de votre parent:Vous devez attribuer un ID à l'exécution, afin d'maven sait quels sont ceux qui écrasent les autres et qui sont indépendants.