Hérité de profils Maven
J'ai les profils suivants dans mes parent pom
<profile>
<id>P1</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>P2</id>
<activation>
<file>
<exists>${project.basedir}/src/main/whatever</exists>
</file>
</activation>
</profile>
Pourquoi P1 est active dans enfant POM et P2 n'est-ce pas?
Le répertoire ${project.basedir}/src/main/whatever
, n'existe pas dans le projet parent, mais il existe chez l'enfant une.
- Le répertoire référencé dans la condition d'activation pour
P2
existent? Veuillez fournir des informations complètes lorsque vous posez une question. - J'ai édité ma question pour répondre à votre commentaire.
- est-il un jour sur la question?
Vous devez vous connecter pour publier un commentaire.
Profil
P2
n'est pas activé, car le chemin sous sesexists
balise ne se résout pas à un chemin existant, même si le répertoire${project.basedir}/src/main/whatever
existe. Si vous réécrivez la propriété${project.basedir}
comme${basedir}
, il est conseillé d'activer laP2
profil.Qui devrait signifier que la
${project.basedir}
ne résout pas le projet de répertoire de base comme il devrait. Lehelp:effective-pom
montre qu'il n'a, cependant. J'ai signalé ce (MNG-5516).Qui est correct. Citant le documentation de
activeByDefault
:Le mot hériter m'a confondu, parce que le "profil de l'héritage" travaille dans projet d'agrégation mais pas dans projet héritage.
Pour rendre les choses claires, je simule cette situation. Vide pom signifie qu'il est vide, sauf pour le modèle standard, groupe, artefact et les balises de version.
Scénario Simple
Structure de répertoire:
pom contenu:
Si il n'y a pas de
dir
répertoiremvn help:all-profiles
sorties:Si il y a
dir
répertoiremvn help:all-profiles
sorties:Projet héritage
Structure de répertoire:
Enfant pom est vide tandis que le pom parent a les profils comme dans le scénario simple. Indépendamment de l'existence de la
inheritance/child/dir
répertoire de coursemvn help:all-profiles
dechild
répertoire sorties:Lors de l'exécution de
mvn help:effective-pom
dechild
répertoire, il montre que les profils sont en effet pas héréditaire. Il se comporte comme documenté:Pas de profils sont mentionnés ici.
Projet d'agrégation
Structure de répertoire:
Module pom est vide tandis que l'agrégateur de pom a les profils comme dans le scénario simple. Si il n'y a pas de
aggregation/module/dir
répertoire de coursemvn help:all-profiles
demodule
répertoire sorties:Si il y a
aggregation/module/dir
répertoire de coursemvn help:all-profiles
demodule
répertoire sorties:Lors de l'exécution de
mvn help:effective-pom
demodule
répertoire, il montre que les profils sont héritées. Ce n'est pas explicitement documentées:Projet héritage
Notes:
inheritance
répertoire ne peuvent exécuter que des parents construire de.Projet d'agrégation
Notes:
aggregation
répertoire d'exécuter la construction de chaque module et de l'agrégateur (de l'ordre réel est déterminé par maven en fonction de différents critères).Conclusion
Profils peuvent être défini à l'échelle mondiale, par utilisateur ou par projet. Depuis l'ensemble des projets sont construits ensemble (dans la même construction) une sorte de résolution de profil doit être exécuté pour calculer les actifs. Donc, c'est la confusion de la partie:
Cela a été testé à l'aide de Maven 3.1.0. et 3.0.5.
Juste pour clarifier sur ce, des Profils Maven sont en fait hérité. Pour une référence à un autre DONC, la question, voir: Héritant des profils Maven. J'ai réussi a hérité des profils dans mon projet, et aucun travail supplémentaire n'est nécessaire.
Comme pour la question initiale, vous avez une variable définie dans le existe élément. Selon le la documentation:
Donc, ce que je reçois est que ${projet.basedir} ne peut pas être utilisé, et ne fonctionnera pas. Si toutefois vous avez défini comme une variable d'environnement, il va fonctionner.
Une mise en garde que j'ai trouvé est que, dans le pom parent
<plugin de gestion de l'>
doit être utilisé pour configurer les plugins. Cependant, dans les profils, je trouve que<plugin-management>
ne doit pas être utilisé pour le profil de configuration spécifiques au travail.sql-maven-plugin
) dans la configuration de chaque exécution. Cela ressemble à un mineur XML-fusion problème, mais n'est pas trop un problème, et c'est pourquoi je n'ai fait aucun problème à cet égard.Le problème n'est pas avec héritage mais avec interpolation (c'est à dire dont les valeurs sont prises en charge pour
${...}
): fichier de la base de l'activation du profil prend uniquement en charge limitée interpolation: voir http://maven.apache.org/pom.html#ActivationDonc
${project.basedir}
n'est pas pris en charge, mais seulement${basedir}
(et les propriétés du système).Pour plus de détails, vous pouvez avoir un coup d'oeil à la construction d'un modèle de l'algorithme: http://maven.apache.org/ref/3.2.1/maven-model-builder/
Modèle complet d'interpolation qui se passe après l'activation du profil: donc, même si l'effectif de votre pom montre la valeur interpolée pour
${project.basedir}
, la valeur n'est pas calculée lors de l'activation du profil qui se passe.Dans Maven 3.2.2, il y a plusieurs améliorations concernant cette documentation dans http://jira.codehaus.org/browse/MNG-5590, avertissement lors de l'exécution dans http://jira.codehaus.org/browse/MNG-5608 et mieux efficace pom résultat http://jira.codehaus.org/browse/MNG-5612
En général, les profils Maven ne sont pas héréditaire (voir http://jira.codehaus.org/browse/MNG-5127 pour une discussion et des liens vers des articles de blog qui peut être utile). J'ai eu du succès en faisant quelque chose comme ceci:
Aussi, je pense que P1 ne sera pas activée si P2 est. C'est parce que
<activeByDefault>
est vrai pour P1. Le nom de l'élément est un peu trompeur à mon avis. "Active par défaut" implique "toujours actif" lorsqu'il signifie vraiment "active uniquement si aucun autre profil dans ce POM est active."Ci-dessus découverts à l'aide de Maven 3.0.x.
${basedir}
est relative à l'enfant de projet).Supprimer la P2 à partir de la deuxième profil qui a le fichier en fonction d'activation.