Наследование наследования проекта Maven - нужно ли указывать родительскую версию?
У меня есть два проекта: Родительский проект: A, Sub project: B
А/pom.xml:
<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>pom</packaging>
И в B/pom.xml у меня есть:
<parent>
<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>0.1-SNAPSHOT</version>
</parent>
<groupId>com.dummy.bla.sub</groupId>
<artifactId>kid</artifactId>
Я хочу, чтобы B наследовал версию от родителя, поэтому единственное место в моем случае мне нужно поставить 0.1-SNAPSHOT
is A/pom.xml
. Но если я удалю <version>0.1-SNAPSHOT</version>
из B/pom.xml
в родительском разделе, maven жалуется на отсутствующую версию для родителя.
Есть ли способ, которым я могу просто использовать ${project.version}
или что-то вроде этого, чтобы избежать 01.-SNAPSHOT
в обоих poms?
Ответы
Ответ 1
Нет, нет. Вы всегда должны указывать родительскую версию. К счастью, он наследуется как версия модуля, что желательно в большинстве случаев. Кроме того, это объявление родительской версии автоматически загружается Maven Release Plugin, поэтому - на самом деле - это не проблема, когда у вас есть версия в двух местах, если вы используете Maven Release Plugin для выпуска или просто набрасывания версий.
Обратите внимание, что есть некоторые случаи, когда это поведение на самом деле довольно хорошо и дает большую гибкость, в которой вы, возможно, нуждаетесь. Иногда вы хотите использовать некоторые из предыдущих родительских версий для наследования, однако это не основной случай.
Ответ 2
Maven не предназначен для работы таким образом, но для достижения этой цели существует обходной путь (возможно, с побочными эффектами, вам придется попробовать). Хитрость заключается в том, чтобы рассказать дочернему проекту о том, что его родительский объект имеет свой относительный путь, а не его чистые координаты maven, и в дополнение к экстернализации номера версии в свойстве:
Родительский pom
<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>${global.version}</version>
<packaging>pom</packaging>
<properties>
<!-- Unique entry point for version number management -->
<global.version>0.1-SNAPSHOT</global.version>
</properties>
Ребенок pom
<parent>
<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>${global.version}</version>
<relativePath>..</relativePath>
</parent>
<groupId>com.dummy.bla.sub</groupId>
<artifactId>kid</artifactId>
Я использовал этот трюк какое-то время для одного из моих проектов без особых проблем, кроме того факта, что maven записывает много предупреждений в начале сборки, что не очень элегантно.
ИЗМЕНИТЬ
Кажется, maven 3.0.4 больше не разрешает такую конфигурацию.
Ответ 3
Самый простой способ обновления версий IMO:
$ mvn versions:set -DgenerateBackupPoms=false
(сделайте это в папке root/parent pom).
Ваши POMs разобраны, и вас спросят, какую версию установить.
Ответ 4
Вы также можете использовать:
$ mvn release:update-versions -DdevelopmentVersion={version}
для обновления номеров версий в POM.
Ответ 5
Как упоминал Янфлеа, есть способ обойти это.
В Maven 3.5.0 вы можете использовать следующий способ переноса версии из родительского проекта:
Родительский POM.xml
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mydomain</groupId>
<artifactId>myprojectparent</artifactId>
<packaging>pom</packaging>
<version>${myversion}</version>
<name>MyProjectParent</name>
<properties>
<myversion>0.1-SNAPSHOT</myversion>
</properties>
<modules>
<module>modulefolder</module>
</modules>
...
</project>
Модуль POM.xml
<project ...>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.mydomain</groupId>
<artifactId>myprojectmodule</artifactId>
<version>${myversion}</version> <!-- This still needs to be set, but you can use properties from parent -->
</parent>
<groupId>se.car_o_liner</groupId>
<artifactId>vinno</artifactId>
<packaging>war</packaging>
<name>Vinno</name>
<!-- Note that there no version specified; it inherited from parent -->
...
</project>
Вы можете изменить myversion
на то, что хотите, это не зарезервированное свойство.
Ответ 6
С Maven 3.5.0 вы можете использовать заполнитель ${revision}
для этого. Использование описано здесь: Maven CI Friendly Versions.
Короче говоря, родительский pom выглядит так (цитируется в документации Apache):
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>18</version>
</parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<name>First CI Friendly</name>
<version>${revision}</version>
...
<properties>
<revision>1.0.0-SNAPSHOT</revision>
</properties>
<modules>
<module>child1</module>
..
</modules>
</project>
и ребенок помёт, как это
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-parent</artifactId>
<version>${revision}</version>
</parent>
<groupId>org.apache.maven.ci</groupId>
<artifactId>ci-child</artifactId>
...
</project>
Вы также должны использовать плагин Flatten Maven для создания документов pom с выделенным номером версии, включенным для развертывания. Документ HowTo описан в связанной документации.
Кроме того, @khmarbaise написал приятный пост блоба об этой функции: Maven: POM файлы без версии в нем?
Ответ 7
Ответ eFox работал для одного проекта, но не тогда, когда я ссылался на модуль из другого (pom.xml все еще хранился в моем .m2
с свойством вместо версии).
Тем не менее, он работает, если вы объедините его с flatten-maven-plugin
, так как он создает помпы с правильной версией, а не с собственностью.
Единственный вариант, я изменил в съемном определения является outputDirectory
, он по умолчанию пустой, но я предпочитаю иметь его в target
, которая устанавливается в моей .gitignore
конфигурации:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.0.1</version>
<configuration>
<updatePomFile>true</updatePomFile>
<outputDirectory>target</outputDirectory>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
</executions>
</plugin>
Конфигурация подключаемого модуля находится в родительском pom.xml