Maven duplicated groupId, artifactId и версии в подмодулях

Мы оптимизируем нашу конфигурацию Maven (ранее использовав ant), и я только что прочитал Maven by Example из книги Sonatype, Дублирование конфигураций привело нас к неприятностям в прошлом, поэтому я абсолютно хочу избежать даже самой маленькой части этого.

В приведенной выше книге упоминается использование встроенных свойств project.groupId и project.version из родительского модуля при обращении к другим подмодулям sibling в качестве зависимостей:

<dependency>
  <groupId>${project.groupId}</groupId>
  <artifactId>model</artifactId>
  <version>${project.version}</version>
</dependency>

Это отлично работает, мне это нравится. Но это не работает в теге подмодуля pom.xml's:

<parent>
    <groupId>${project.groupId}</groupId>
    <artifactId>${project.artifactId}</artifactId>
    <version>${project.version}</version>
    <relativePath>../pom.xml</relativePath>
</parent>

Я предполагаю, что это не большая проблема, похоже, что я могу создавать для них свойства, но со многими модулями мне бы очень хотелось полностью понять лучшие практики для этих проблем.

UPDATE Кажется, лучший способ сделать это следующим образом. Немного уродливый, но устраняет повторяющиеся жестко заданные значения. parent pom.xml:

<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<packaging>pom</packaging>
<version>${version}</version>
<properties>
    <groupId>com.mycompany</groupId>
    <artifactId>mycompany</artifactId>
    <version>1.0</version>
</properties>

child pom.xml:

<parent>
    <groupId>${groupId}</groupId>
    <artifactId>${artifactId}</artifactId>
    <version>${version}</version>
    <relativePath>../pom.xml</relativePath>
</parent>
<artifactId>child</artifactId>

Ответы

Ответ 1

Это отлично работает, мне это нравится. Но это не работает в теге подмодуля pom.xml(...)

Это не может работать, проблема с курицей и яйцом: вы не можете получить координаты родителя для использования от родителя.

Я предполагаю, что это не большая проблема, похоже, что я могу создавать для них свойства, но со многими модулями я бы очень хотел полностью понять лучшие методы для этих проблем.

Ну, полагая, что это сработает (и, насколько мне известно, свойства не будут расширены в родительском элементе, поэтому он не будет), где бы эти свойства были добавлены? В родительском? Та же проблема, что и выше. У ребенка? Нет смысла. Короче говоря, вам нужно жестко закодировать эти значения в родительском элементе

Обратите внимание, что это не проблема для groupId и artifactId, поскольку они не изменяются; однако это более раздражает для version, и я предлагаю либо использовать Maven Release Plugin, либо Версии Maven Plugin (и его versions:update-child-modules цель).

PS: Maven 3.1 будет поддерживать родительский элемент без версии (см. MNG-624).

Похожие ответы


Почему я не могу получить координаты родителя от родителя? ОтносительныйPath должен предоставить мне доступ к родительскому pom. Таким образом, это действительно работает, если вы добавите в родительский объект groupId, artifactId и версию как свойства, а затем ссылаетесь на эти свойства для родителя в дочернем элементе. Чтобы не было дублированных значений, соответствующие жестко закодированные элементы в родительском были заменены также ссылками на свойства. Это кажется уродливым способом, но это работает...

Нет, работает НЕ, в родительском элементе (для последующей воспроизводимости) допускается замена свойства не. То, как он разработан в Maven 2.x. См. MNG-624 и миллионы потоков об этом в списке рассылки пользователей, например:

Вы спросили о лучшей практике, я ответил: hard-code все в родительском элементе. Период.