Что такое неявный идентификатор выполнения плагина maven?

Чтобы отключить выполнение плагина, унаследованного родительским POM, его можно переопределить следующим образом:

<execution>
    <id>TheNameOfTheRelevantExecution</id>
    <phase/>
</execution>

Теперь, если родительский POM не определяет явный идентификатор выполнения? В этом ответе говорится, что "если вы не укажете id для выполнения, Maven сделает это неявно (таким образом, чтобы вы не ожидали от вас интуитивно" ). Итак, как идентификаторы выполнения, сгенерированные Maven? Бонусные точки для связывания соответствующего исходного кода Maven.

Примечание. Я не ищу альтернативные способы отключения выполнения плагина.

Ответ 1

По умолчанию Maven создаст идентификатор выполнения, применяя следующие шаблоны в зависимости от разных случаев:

  • Идентификатор выполнения, установленный для: default-cli для плагина: цели, выполняемые из командной строки
  • Идентификатор выполнения, установленный для: default-<goal_name> для плагина: цели, выполняемые как часть binding, определяемые конкретной упаковкой
  • Идентификатор выполнения, установленный для: default для плагина: выполнение целей как часть POM, которая не указала какой-либо идентификатор.

Если вы выполните Maven Dependency Plugin из командной строки, например, с классической целью mvn dependency:tree, вы заметите, что default-cli Идентификатор выполнения:

[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ project ---

Если вы посмотрите на вывод любой сборки Maven и при выполнении по умолчанию для Maven Compiler Plugin на этапе компиляции, например, вы заметите default-compile и default-testCompile как идентификаторы выполнения целей compile и testCompile плагина Maven Compiler.

Тот же шаблон применяется ко всем плагинам/целям по умолчанию, выполняемым Maven как часть binding, определенных для данной упаковки. Идентификаторы выполнения всегда находятся между изогнутыми скобками сразу после соответствующего имени плагина и цели.
Например, вырез базовой сборки Maven:

[INFO] --- maven-clean-plugin:2.5:clean (default-clean)
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) 
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) 
[INFO] --- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) 
[INFO] --- maven-surefire-plugin:2.19:test (default-test)  

Показывает, как идентификаторы выполнения (последний токен в фрагменте выше, между скобками) всегда следуют этому шаблону.

Наконец, если вы настроите выполнение любого плагина в своей POM без указания идентификатора, вы увидите идентификатор default, примененный Maven:

[INFO] --- exec-maven-plugin:1.1:java (default) @ project ---

От официальная документация Maven:

Идентификатор выполнения командной строки

каждый mojo, вызываемый непосредственно из командной строки, будет иметь назначенный ему идентификатор выполнения по умолчанию-cli, который позволит выполнить конфигурацию этого выполнения из POM с помощью этого идентификатора выполнения по умолчанию

Идентификатор выполнения привязки по умолчанию

каждый mojo, привязанный к жизненному циклу сборки через отображение жизненного цикла по умолчанию для указанной упаковки POM, будет иметь идентификатор выполнения по умолчанию-goalName, назначенный ему

Идентификатор выполнения плагина по умолчанию

значение по умолчанию для executeId - буквально установленное по умолчанию в модели POM - предназначалось для предоставления некоторых из этих функций. К сожалению, это решение никогда не тестировалось, чтобы убедиться, что оно работает с вышеприведенными случаями; они проваливались сквозь трещины во время тестирования. Теперь, с выпуском Maven 2.2.0 (и позже, Maven 3.0), эти примеры использования, наконец, могут быть адресованы


И последнее, но не менее важное: в отношении идентификаторов выполнения, поскольку Maven 3.3.1 вы можете даже указать конкретный идентификатор выполнения вашего POM из командной строки с помощью нового оператора @executionId