Дублировать ИД артефакта в детской пом
Я хочу, чтобы родительский 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> ...
Однако я бы рассмотрел комментарии хмарбеза к этому вопросу.