Каков неявный идентификатор выполнения плагина maven?
Чтобы отключить выполнение плагина, унаследованного родительским POM, можно переопределить его следующим образом:
<execution>
<id>TheNameOfTheRelevantExecution</id>
<phase/>
</execution>
А что если родительский POM не определяет явный идентификатор выполнения? В этом ответе говорится: "Если вы не укажете id для выполнения, Maven сделает это неявно (таким образом, вы не ожидаете этого интуитивно)". Так как же создаются идентификаторы выполнения Maven? Бонусные баллы за ссылку на соответствующий исходный код Maven.
Примечание: я не ищу альтернативных способов отключить выполнение плагина.
1 ответ
По умолчанию Maven создает идентификатор выполнения, применяя следующие шаблоны в зависимости от разных случаев:
- Идентификатор выполнения установлен в:
default-cli
для плагина: цели выполняются из командной строки - Идентификатор выполнения установлен в:
default-<goal_name>
для плагина: цели, выполняемые как часть привязки, определенной конкретной упаковкой - Идентификатор выполнения установлен в:
default
для плагина: выполнение целей как часть POM, в которой не указан идентификатор.
Если вы запускаете Maven Dependency Plugin из командной строки, например, с классическим mvn dependency:tree
цель, вы заметите default-cli
идентификатор выполнения:
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ project ---
Например, если вы посмотрите на вывод любой сборки Maven и на выполнение по умолчанию для плагина компилятора Maven на этапе компиляции, вы заметите default-compile
а также default-testCompile
в качестве идентификаторов исполнения compile
а также testCompile
цели плагина компилятора Maven.
Тот же шаблон применяется ко всем подключаемым модулям / целям по умолчанию, выполняемым Maven как часть привязки, определенной для данной упаковки. Идентификаторы выполнения всегда заключаются в изогнутые скобки сразу после соответствующего плагина и имени цели.
Например, фрагмент базовой сборки 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, вызываемому непосредственно из командной строки, будет присвоен идентификатор выполнения default-cli, который позволит конфигурировать это выполнение из POM с использованием этого идентификатора выполнения по умолчанию
Идентификатор выполнения привязки по умолчанию
каждому mojo, связанному с жизненным циклом сборки через сопоставление жизненного цикла по умолчанию для указанной упаковки POM, будет присвоен идентификатор выполнения default-goalName
Идентификатор выполнения плагина по умолчанию
значение по умолчанию для executeId - буквально установленное по умолчанию в модели POM - предназначалось для предоставления некоторых из этих функций. К сожалению, это решение никогда не тестировалось, чтобы убедиться, что оно работает с приведенными выше вариантами использования; они провалились в трещины во время испытаний. Теперь, с выпуском Maven 2.2.0 (и позже, Maven 3.0), эти варианты использования, наконец, могут быть решены
И последнее, но не менее важное, что касается идентификаторов выполнения, начиная с Maven 3.3.1, вы даже можете указать конкретный идентификатор выполнения вашего POM из командной строки, используя новую @executionId
оператор