Как Maven определяет, какую версию плагина использовать для плагинов, используемых из командной строки?

(используя Maven 3.0.3 на Mac с Java 7)

когда я запускаю mvn dependency:analyze-duplicate maven использует версию 2.1 (независимо от того, доступен ли 2.8 в моем локальном РЕПО или нет) плагина и жалуется:

[ERROR] Could not find goal 'analyze-duplicate' in plugin org.apache.maven.plugins:maven-dependency-plugin:2.1 among available goals unpack-dependencies,....

когда я запускаю его как mvn org.apache.maven.plugins:maven-dependency-plugin:2.8:analyze он работает нормально.

Я бы предположил, что maven всегда возвращается к самой последней версии (даже если еще не в локальном РЕПО), если версия явно не указана?

что я упустил? Спасибо всем за ваше время отвечать.

2 ответов


для некоторых плагинов Apache Maven определил версию по умолчанию в одном и только super-pom, который может быть обновлен с более новой версией Maven. Смотрите текущую магистраль: https://git-wip-us.apache.org/repos/asf?p=maven.git;a=blob_plain;f=maven-model-builder/src/main/resources/org/apache/maven/model/pom-4.0.0.xml

<pluginManagement>
  <!-- NOTE: These plugins will be removed from future versions of the super POM -->
  <!-- They are kept for the moment as they are very unlikely to conflict with lifecycle mappings (MNG-4453) -->
  <plugins>
    <plugin>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>1.3</version>
    </plugin>
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.2-beta-5</version>
    </plugin>
    <plugin>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>2.8</version>
    </plugin>
    <plugin>
      <artifactId>maven-release-plugin</artifactId>
      <version>2.3.2</version>
    </plugin>
  </plugins>
</pluginManagement>

в Maven-3.1 были обновлены как Maven-dependency-plugin, так и Maven-release-plugin. Предыдущие версии все еще использовали 2.1 и 2.0 (в тот же приказ).

таким образом, это значение по умолчанию, если вы не указали версию в своем pom.xml или если у вас его нет.

чтобы увидеть эффективный pom, выполните mvn org.apache.maven.plugins:maven-help-plugin:2.2:effective-pom или help:effective-pom, но затем вы полагаетесь (снова) на версию в super-pom.


описан процесс разрешения версии плагина здесь.

короче говоря Maven будет использовать первую версию, найденную по этим правилам в следующем порядке:

  • версия, определенная в POM проекта
  • версия, определенная в реестре плагинов (если включена)
  • метаданные последней версии
  • версия метаданных

поэтому посмотрите в своем проекте POM (или родительском pom), если вы указали версию для этого плагина есть.

обновление: Что касается вашей проблемы, причина в том, что Maven-dependency-plugin версии 2.1 указан в разделе pluginManagement maven супер пом. Ваш проект POM наследует эти настройки, и поэтому версия 2.1 используется по умолчанию (Upvote ответ @Robert Scholte, который указал на это первым!)