Версия плагина Maven не указана

Я только что заметил, что версия плагина является необязательной в maven. Я все еще могу создать свой модуль, не указав его. Возьмем пример с maven-bundle-plugin.

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    ....
</plugin>

Я написал простой pom.xml без родителя, чтобы попробовать это, поэтому pluginManagement не задействован. Я также проверил супер супер pom-4.0.0.xml в maven-model-builder, чтобы подтвердить, что maven-bundle-plugin не существует. Эта версия плагина нигде не указана.

Как maven определяет, какую версию взять?

Ответ 1

От Замечания по совместимости Maven 3.x:

Автоматическое обновление версии плагина

Когда плагин был вызван без явной версии, указанной в POM или в командной строке, Maven 2.x используется для выбора последней версии где последняя версия может быть либо выпуском, либо снимок. Для стабильности Maven 3.x предпочитает последние релиз версии по последней версии моментального снимка.

Учитывая угрозу невоспроизводимые сборки, накладываемые автоматической версией плагина разрешение, эта функция запланирована для удаления до плагина декларации в ПОМ. Пользователи Maven 3.x найдут его выдает предупреждение, если отсутствуют версии плагинов для обнаружения поощрять добавление версий плагина к POM или одному из своих родительские POM. Правило Enforcer requirePluginVersions можно использовать дополнительно проверьте отсутствие версий плагина в POM.

Ответ 2

Если вы проверите файл maven-metadata.xml, находящийся в удаленном репозитории (например, Nexus), рядом с артефактом плагина, вы увидите что-то вроде этого:

<metadata>
    <groupId>com.company.maven.plugins</groupId>
    <artifactId>some-maven-plugin</artifactId>
    <versioning>
      <latest>0.3.6</latest>
      <release>0.3.6</release>
      <versions>
        <version>0.1</version>
        <version>0.2</version>
        <version>0.3.0</version>
        <version>0.3.1</version>
        <version>0.3.2</version>
        <version>0.3.4</version>
        <version>0.3.5</version>
        <version>0.3.6</version>
      </versions>
      <lastUpdated>20140414212942</lastUpdated>
    </versioning>
  </metadata>

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

Maven 3.0.x дает предупреждения о недостающих версиях плагина и говорит, что "будущие версии Maven могут отказаться от сборки искаженных POM, подобных этим" или что-то в этом роде. Вы всегда должны указывать версии плагинов, чтобы ваша сборка была воспроизводимой. В противном случае вы можете столкнуться с некоторыми очень трудными для поиска ошибок.