Дублировать ИД артефакта в детской пом


Я хочу, чтобы родительский 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 5

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>
  ...

Однако я бы рассмотрел комментарии хмарбеза к этому вопросу.