Как вставить версию проекта архетипа в архетип Maven?
Я создаю архетип Maven, который генерирует скелет проекта, который
будет включать зависимость от проекта, из которого архетип
возникла.
Например, проект происхождения выглядит так:
origin/archetype/... archetype for generating project
/core/... core services
/extra/... extra services
и архетип будет генерировать проект с POM, который содержит
так:
<dependencies>
<dependency>
<groupId>com.foo</groupId>
<artifactId>origin-core</artifactId>
<version>SOMEVERSION</code>
</dependency>
</dependencies>
Я хочу, чтобы SOMEVERSION была версией проекта происхождения в то время
что архетип построен и установлен в репозиторий.
Итак, если исходный проект находится в версии 1.0-SNAPSHOT и mvn
install
ed, тогда я хочу, чтобы архетип генерировал зависимость от
origin-core 1.0-SNAPSHOT
. И когда проект происхождения будет выпущен, и автоматически
bunch to version 1.0, я хочу, чтобы архетип генерировал зависимость от
origin-core 1.0
.
В основном я бы хотел использовать ${archetypeVersion}
как переменную Velocity в архетипе
POM, но это не представляется возможным.
Есть ли другой способ выполнить то, что я пытаюсь сделать здесь?
Ответы
Ответ 1
Я спросил этот вопрос в списке рассылки Maven несколько дней назад и получил перепады. К счастью, я в конце концов понял это сам. Здесь, по крайней мере, один разумный способ сделать это:
Используйте фильтрацию Maven в вашем файле src/main/resources/archetype-resources/pom.xml
для замены в текущей версии проекта при создании архетипа.
Вот как это делается:
Измените файл archetype/pom.xml
, чтобы включить фильтрацию в файле archetype-resources/pom.xml
, а не на что-либо еще (потому что ваши файлы архетипа, естественно, будут иметь ${variable}
повсюду, и вы не хотите, чтобы их заменяли при сборке вы хотите, чтобы они были заменены при создании архетипа).
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>archetype-resources/pom.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>archetype-resources/pom.xml</exclude>
</excludes>
</resource>
</resources>
Включить escape-символ для использования при фильтрации, чтобы вы могли избежать всех переменных в вашем архетипе pom, которые должны оставаться как есть, чтобы их можно было заменить на время генерации архетипа:
<pluginManagement>
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<escapeString>\</escapeString>
</configuration>
</plugin>
</plugins>
</pluginManagement>
(Обратите внимание, что элементы <resources>
и <pluginManagement>
, показанные выше, должны быть помещены внутри элемента <build>
вашего POM.)
Используйте ${project.version}
в вашем архетипе pom, где вы хотите, чтобы версия вашего проекта архетипа была вставлена, и избегайте всех других переменных, которые должны оставаться незамеченными до времени генерации архетипа:
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>\${groupId}</groupId>
<artifactId>\${artifactId}</artifactId>
<version>\${version}</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.foo</groupId>
<artifactId>origin-core</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
Ответ 2
Альтернативным решением принятого ответа является фильтрация свойства по умолчанию в файле файла архетипа/метаданных
Это делается следующим образом:
Фильтр maven фильтрует только этот файл:
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>META-INF/maven/archetype-metadata.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>META-INF/maven/archetype-metadata.xml</exclude>
</excludes>
</resource>
</resources>
Файл метаданных архетипа:
<archetype-descriptor ...>
<requiredProperties>
<requiredProperty key="projectVersion">
<defaultValue>${project.version}</defaultValue>
</requiredProperty>
</requiredProperties>
...
</archetype-descriptor>
а архетип POM будет похож на предыдущий, за исключением того, что в качестве версии проекта будет использоваться значение свойства projectVersion
required:
<?xml version="1.0" encoding="UTF-8"?>
<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.foo</groupId>
<artifactId>origin-core</artifactId>
<version>${projectVersion}</version>
</dependency>
</dependencies>
</project>
Этот подход имеет то преимущество, что он избегает необходимости избегать всех значений свойств в архетипе POM и конфигурации плагина ресурса, которая идет с ним. Лично я нахожу все это довольно уродливым и подверженным ошибкам.
Это означает, что пользователю предлагается подтвердить или изменить версию проекта при создании архетипа. В зависимости от сценария, я думаю, это можно считать хорошим или плохим.
Ответ 3
Я пробовал что-то довольно глупое, и, похоже, это сработало. Я добавил следующее в файл META-INF/maven/archetype-metadata.xml:
<requiredProperties>
<requiredProperty key="archetypeVersion"> </requiredProperty>
</requiredProperties>
Вы могли бы подумать, что по умолчанию это будет известно, но это не похоже на то, что это напоминает его использовать. Возможно, это из-за ошибки в maven.