Подтвердить что ты не робот

Как вставить версию проекта архетипа в архетип 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, но это не представляется возможным.

Есть ли другой способ выполнить то, что я пытаюсь сделать здесь?

4b9b3361

Ответ 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.