Дублировать ИД артефакта в детской пом
Я хочу, чтобы родительский POM определял некоторые свойства для наследования многочисленных дочерних POM. Однако когда я пытаюсь использовать artifactId в одном из этих свойств в Родительском pom, он дублируется в эффективном POM ребенка. Очень простой пример ниже. Предположим, что у меня есть все допустимые поля, необходимые для poms (groupId, version, packaging и т. д.).
Эффективный pom родительского pom имеет значение соединения scm www.mysite.com/parent-pom. Но эффективный pom ребенка имеет значение соединения scm www.mysite.com/child-pom/child-pom. Как я могу получить это наследование свойства и общей структуры url соединения, без дубликата artifactId. Я хочу, чтобы у ребенка pom было соединение scm www.mysite.com/child-pom.
Родитель:
<project>
<artifactId>parent-pom</artifactId>
<properties>
<scmurl>www.mysite.com</scmurl>
</properties>
<scm>
<connection>${scmurl}/${artifactId}</connection>
</scm>
</project>
Ребенок:
<project>
<parent>
<artifactId>parent-pom</artifactId>
</parent>
<artifactId>child-pom</artifactId>
</project>
3 ответа:
Эдвардмайт,
Есть 2 решения того, что вы пытаетесь сделать, но ни одно из них не является оптимальным.Фундаментальная Проблема
Если Maven SCM plugin обнаружит, что блок
<scm>был определен в вашем Родителе, но не в вашем ребенке, то это будет означать, что путь SCM вашего ребенка является просто поддиром родителя. В вашем случае есть дополнительная морщинка, которую сам url вашего родителя содержит${project.artifactId}, которая интерполируется на уровне потомка до того, как снова прищемить искусственника.В основном, он делает следующее:
project.scm.connection=${parent.scm.connection}/${project.artifactId} project.scm.connection=${scmurl}/${project.artifactId}/${project.artifactId} project.scm.connection=www.mysite.com/child-pom/child-pomТот факт, что url вашего родителя содержит
${artifactId}, усугубляет путаницу, но даже если вы жестко закодируете url вwww.mysite.com/parent-pom/, вы не сможете обойти тот факт, что SCM plugin думает, чтоchild-pomявляется поддиром url родителя и поэтому просто прикрепит его к концу пути.Ваши 2 варианта:
Избыточный, но простой
Поместите следующее В каждый детский помпон.xml-файл:
<scm> <connection>${scmurl}/${artifactId}</connection> </scm>, это раздражает, но относительно проста.
Эффективный, но хитрый
У parent-pom есть следующее:
<scm> <connection>${scmurl}/</connection> </scm>Это приведет к тому, что каждый ребенок будет иметь правильный url, но сам родитель будет перепутан.
Вы можете обойти эту проблему, поместив правильный url-адрес родителя в профиль:
<profile> <id>parent-profile</id> <scm> <connection>${scmurl}/parent-pom</connection> </scm> </profile> $ mvn -Pparent-profile ...Это менее очевидно и подвержено ошибкам вручную, но это позволит избежать необходимости редактировать каждый файл пом ребенка.
Надеюсь, это поможет.
Мой ответ не так уж сильно отличается от @333kenshin и был фактически выведен из него, но я думаю, что он приводит к несколько более лаконичной пасте.
В моем родительском pom я добавил следующее К
<properties><git.account>xenworks</git.account> <git.base>bitbucket.org/${git.account}/${project.artifactId}</git.base> <git.conn>scm:git:https://${git.base}.git</git.conn> <git.devConn>scm:git:ssh://git@${git.base}.git</git.devConn> <git.url>https://${git.base}</git.url>Теперь в children и parent я могу определить scm следующим образом.
<scm> <connection>${git.conn}</connection> <developerConnection>${git.devConn}</developerConnection> <url>${git.url}</url> <tag>HEAD</tag> </scm>Последний вклад, который я хотел бы сделать, заключается в том, что есть открытая ошибка в Maven Jira
Откуда берется
${scmurl}? Свойство называетсяurl.Если адаптировать
parent-pomсоответственно:<scmurl>www.mysite.com</scmurl>... поведение таково, как описано в OQ:
/parent-pom$ mvn help:effective-pom ... <scm> <connection>www.mysite.com/parent-pom</connection> </scm> ...
<relativePath>../parent-pom</relativePath>(предполагая, что они являются братьями и сестрами в файловой системе) должен быть добавлен вchild-pom, Еслиparent-pomеще не былinstallЕд в локальное хранилище Maven (пока). В противном случае произойдет следующее:Это тоже кажется мне странным на первый взгляд. Я все еще рыщу по документам, чтобы найти (логическое) объяснение этому./child-pom$ mvn help:effective-pom ... <scm> <connection>www.mysite.com/child-pom/child-pom</connection> </scm> ...Замена
${artifactId}на${project.artifactId}, как это предлагается в комментариях, не помогает.Повторение
<scm><connection>${scmurl}/${artifactId}</connection></scm>вchild-pomпомогает:/child-pom$ mvn help:effective-pom ... <scm> <connection>www.mysite.com/child-pom</connection> </scm> ...Однако я бы рассмотрел комментарии хмарбеза к этому вопросу.