Если вы используете Apache Maven Я полагаю, вы уже настроили несколько плагинов в своем pom-файле. В качестве примера мы используем плагин Maven Enforcer , чтобы предотвратить запуск данной сборки с версией Maven, которая меньше 3.5.0, которая выглядит следующим образом:
org.apache.maven.plugins maven-enforcer-plugin 3.0.0-M3 id-enforce enforce 3.5.0
Теперь вы вызываете Maven следующим образом: mvn enforcer:enforce
но теперь вы удивлены неудачей, с которой столкнетесь (для краткости вставил некоторые разрывы строк в выходные данные):
$ mvn enforcer:enforce [INFO] Scanning for projects... [INFO] [INFO] -------------< com.soebes.articles.plugins:configuration >-------------- [INFO] Building configuration 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.363 s [INFO] Finished at: 2021-03-22T20:01:53+01:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) on project configuration: No rules are configured. Use the skip flag if you want to disable execution. -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
Похоже, что конфигурация, которую мы привели в примере, не учитывается. Что я должен сказать. Да, в этом-то все и дело. Теперь главный вопрос: почему?
Подробности
Давайте подробнее рассмотрим, почему это происходит. Причина в том, что при вызове Maven через mvn enforcer:enforce
вы не запустили жизненный цикл (что-то вроде clean
, package
или что-то подобное). Вы просили выполнить поставленную цель обеспечить соблюдение
из |/Плагин Maven Enforcer .
Это означает, что в конечном итоге существует разница в настройке плагинов между вызовом жизненного цикла и цели .
Как мы можем проверить, что то, что я утверждал, верно? Это легко сделать, просто вызвав фазу жизненного цикла/| как инициализировать (вы также можете использовать
verify или |/package
вместо инициализировать
только бег занимает больше времени.):
$ mvn initialize [INFO] Scanning for projects... [INFO] [INFO] -------------< com.soebes.articles.plugins:configuration >-------------- [INFO] Building configuration 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (id-enforce) @ configuration --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.355 s [INFO] Finished at: 2021-03-22T20:02:40+01:00 [INFO] ------------------------------------------------------------------------
Итак, первая миссия выполнена и доказано, что ранее заданная конфигурация теперь учитывается.
Итак, основываясь на этих выводах, можем ли мы каким-то образом создать конфигурацию, которая учитывается при вызове цели enforcer:enforce
? Да, есть способ сделать это с помощью следующей конфигурации:
org.apache.maven.plugins maven-enforcer-plugin 3.0.0-M3 default-cli enforce 3.5.0
Теперь мы называем цель:
$ mvn enforcer:enforce [INFO] Scanning for projects... [INFO] [INFO] -------------< com.soebes.articles.plugins:configuration >-------------- [INFO] Building configuration 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.516 s [INFO] Finished at: 2021-03-22T20:29:34+01:00 [INFO] ------------------------------------------------------------------------
Вы также можете вызвать жизненный цикл следующим образом:
$ mvn initialize [INFO] Scanning for projects... [INFO] [INFO] -------------< com.soebes.articles.plugins:configuration >-------------- [INFO] Building configuration 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.498 s [INFO] Finished at: 2021-03-27T16:18:03+01:00 [INFO] ------------------------------------------------------------------------
Вы заметили разницу? Единственная разница была между id-enforcement
(из первого примера конфигурации) и default-cli
во втором случае. Имя default-cli
, как следует из названия, используется по умолчанию для выполнения командной строки. Это означает, что вы можете определить конфигурацию/выполнение, которые используются только для вызова целей из командной строки и не являются частью жизненного цикла .
На следующем шаге мы хотели бы создать конфигурации, в которых один из них применяется для выполнения командной строки default-cli
и еще один для выполнения жизненного цикла другой-id
.
org.apache.maven.plugins maven-enforcer-plugin 3.0.0-M3 default-cli enforce 25 another-id enforce 3.9.0
Приведенная выше конфигурация требует, чтобы для сборки использовалась версия JDK 25 вместо той, которую я использую в настоящее время (только для демонстрационных целей; Хорошо, возможно, немного в будущем). Вторая конфигурация проверяет версию Maven, которая, как ожидается, будет использоваться для этой сборки. Итак, давайте сначала назовем цель:
$ mvn enforcer:enforce [INFO] Scanning for projects... [INFO] [INFO] -------------< com.soebes.articles.plugins:configuration >-------------- [INFO] Building configuration 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration --- [WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message: Detected JDK Version: 11.0.9 is not in the allowed range 25. [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.549 s [INFO] Finished at: 2021-03-22T20:45:27+01:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) on project configuration: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
Вы можете видеть, что в командной строке учитывается только конфигурация, которую можно определить по сообщению Обнаружена версия JDK: 11.0.9 не находится в допустимом диапазоне 25.
. Так что сработало, как и ожидалось. Теперь мы пытаемся выполнить в рамках жизненного цикла:
$ mvn initialize [INFO] Scanning for projects... [INFO] [INFO] -------------< com.soebes.articles.plugins:configuration >-------------- [INFO] Building configuration 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration --- [WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message: Detected JDK Version: 11.0.9 is not in the allowed range 25. [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.450 s [INFO] Finished at: 2021-03-27T16:40:31+01:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) on project configuration: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
Этого никто не ожидал? Этого никто не ожидал? Этого никто не ожидал? цель, которая имеет привязку по умолчанию к
жизненному циклу , которую можно определить, прочитав документ плагина (отрывок из него):
enforcer:enforce Full name: org.apache.maven.plugins:maven-enforcer-plugin:3.0.0-M3:enforce Description: This goal executes the defined enforcer-rules once per module. Attributes: * Requires a Maven project to be executed. * Binds by default to the lifecycle phase: validate.
Важная часть – это последняя строка: Привязывается по умолчанию к фазе жизненного цикла: проверка.
. Это описывает поведение, которое мы можем наблюдать здесь. Мы используем цель принудительное применение
просто определяя/| цель . Если вы привязываете плагин следующим образом:
..... ... default-cli enforce 25 another-id enforce 3.9.0
Это подразумевает, что фаза жизненного цикла, к которой привязан плагин, выполняется самим плагином. Это означает, что в конечном итоге окончательная конфигурация выглядит следующим образом:
..... ... default-cli enforce initialize 25 another-id enforce initialize 3.9.0
Это означает, что при вызове жизненного цикла mvn initialize
будут выполнены оба выполнения, и в конце также будет выполнено первое (для версии java), даже если указать default-cli
.
Привязка к Жизненному циклу
В тех случаях, когда вы хотите уточнить, к какой фазе жизненного цикла привязан плагин, просто запишите его в конфигурацию. Это позволяет переопределять значения по умолчанию, которые определил плагин (лучше автор (ы) плагина). Мы можем использовать эту информацию для решения нашей проблемы, изменив конфигурацию с помощью следующего подхода: мы просто отделяем принудительное выполнение
цели для одного выполнения от жизненного цикла путем определения жизненного цикла фазы ( НЕИЗВЕСТНО
), которая просто не существуют.
org.apache.maven.plugins maven-enforcer-plugin 3.0.0-M3 default-cli enforce UNKNOWN 25 another-id enforce 3.9.0
Другая конфигурация another-id
может быть сохранена без изменений. Эта (предполагаемая) связь могла быть идентифицирована в более ранних выходных данных, где была распечатана строка:
$ mvn initialize ... [INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (default-cli) @ configuration --- ..
Это указывает на то, что цель принудительное применение
плагина привязана к жизненному циклу по умолчанию инициализировать
самим плагином в противоречии с выводом (по умолчанию -cli)
(что может привести нас на ложный путь).
Это явный признак того, что данная цель ( enforce
) не предназначена для вызова из командной строки. Обычно я рекомендую не пытаться настраивать/выполнять цели в командной строке, пока в документах показано: Привязывается по умолчанию к фазе жизненного цикла: ..
. Скорее всего, есть исключения, но в целом не пробуйте это, иначе вы перейдете на темную сторону силы 😉
Есть также примеры, такие как Плагин сборки Maven , который имеет ровно одну цель single
, которая вообще не привязана к фазе жизненного цикла. Это не означает, что вы должны использовать single
goal через командную строку (технически вы можете) но обычно это не имеет смысла. Как правило, имеет смысл привязать single
цель к фазе жизненного цикла с помощью соответствующей конфигурации. Основываясь на различных настройках проекта, имело бы смысл привязать его к prepare-package
или к package
вместо этого фаза. Именно по этой причине плагин по умолчанию не привязан ни к какой фазе, иначе было бы необходимо отделить его от одной из фаз, если вы используете другую.
Цели Для Командной Строки
Давайте взглянем на плагин, который используется из команды более или менее исключительно. Плагин Versions Maven имеет множество целей, которые все предназначены для вызова через командную строку, а не в рамках жизненного цикла .
Взгляните на типичный пример того, как используется плагин Versions Maven . У нас есть проект, в котором мы хотели бы изменить номер версии. Это можно легко сделать, используя следующий вызов:
$ mvn versions:set -DnewVersion=1.2.0 -DgenerateBackupPoms=false ...
Таким образом, плагин изменит версии в pom.xml
файл. Вы должны запомнить этот вариант -DgenerateBackupPoms=false
каждый раз, когда вы вызываете его, в противном случае будут создаваться резервные копии оригинала pom.xml
файлы ( pom.xml.versionsBackup
). После этого вы должны либо удалить эти файлы вручную, либо с помощью системы управления версиями, но эту ситуацию можно улучшить, используя конфигурацию только для командной строки. Конфигурация выглядит следующим образом:
... org.codehaus.mojo versions-maven-plugin 2.8.1 default-cli false
Теперь вы можете сделать более простой вызов, подобный этому:
$ mvn versions:set -DnewVersion=2.0.0-SNAPSHOT [INFO] Scanning for projects... [INFO] [INFO] -------------< com.soebes.articles.plugins:configuration >-------------- [INFO] Building configuration 1.0.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- versions-maven-plugin:2.8.1:set (default-cli) @ configuration --- [INFO] Local aggregation root: /.../configuration [INFO] Processing change of com.soebes.articles.plugins:configuration:1.0.0-SNAPSHOT -> 2.0.0-SNAPSHOT [INFO] Processing com.soebes.articles.plugins:configuration [INFO] Updating project com.soebes.articles.plugins:configuration [INFO] from version 1.0.0-SNAPSHOT to 2.0.0-SNAPSHOT [INFO] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.853 s [INFO] Finished at: 2021-03-28T20:32:58+02:00 [INFO] ------------------------------------------------------------------------
Конфигурация для различных вызовов командной строки
Мы достигли интересного уровня настроек для плагинов Maven, к сожалению, есть ограничение. Вы можете настроить только один вызов командной строки ( default-cli
). Если вы хотите создать разную конфигурацию для разных вызовов CLI, это просто невозможно таким образом.
Начиная с Maven 3.3.1 + (тем временем, 5 лет назад) появилось интересное усовершенствование для вызова цели.
Давайте начнем с default-cli
на основе предыдущих примеров (используя exec-maven-plugin здесь):
org.codehaus.mojo exec-maven-plugin 3.0.0 default-cli com.soebes.test.First
Как подробно описано в предыдущих частях, теперь вы можете вызвать Maven следующим образом:
$ mvn exec:java ...
Это будет использовать вышеуказанную конфигурацию. Итак, теперь мы улучшаем пример следующим образом:
org.codehaus.mojo exec-maven-plugin 3.0.0 default-cli com.soebes.test.First second-cli com.soebes.test.Second
Теперь вы можете вызвать Maven следующим образом:
$ mvn exec:java@second-cli
Я хотел бы подчеркнуть @second-clip
после гола java
который позволяет вам выбрать, какая из заданных записей ( ..
) будет использоваться при вызове цели. Итак, теперь вы можете создать конфигурацию по умолчанию через default-cli
и несколько других конфигураций, которые можно выбрать, просто указав идентификатор во время вызова командной строки.
Это открывает новый уровень настройки вызова команд.
Возможно, вы знаете build-helper-maven-plugin , который можно использовать в сочетании с versions-maven-plugin для увеличения ваших версий без maven-release-plugin через командную строку следующим образом:
mvn build-helper:parse-version versions:set \ -DnewVersion=\${parsedVersion.nextMajorVersion}.0.0 \ versions:commit
В этом вызове мы вызываем два разных плагина с тремя целями. Первый – это build-helper-maven-plugin
с целью parse-version
, а второй versions-maven-plugin
с использованием цели set
и, наконец, versions-maven-plugin
с целью фиксации
.
Цель parse-version
считывает информацию из pom.xml
связан с тегом версии в свойствах плагина и создает некоторые дополнительные полезные новые свойства, которые могут быть использованы позже для использования в части командной строки: -DnewVersion=\${проанализированная версия.nextMajorVersion}.0.0
. Это будет использовать свойство проанализированная версия.следующая основная версия
и использовать его в качестве входных данных в set
цель для определения новой основной версии. Это означает, что в конце концов он увеличит основную версию на единицу. Конечная цель фиксации
внесет изменение в pom.xml
постоянный. Это также может быть достигнуто с помощью ранее упомянутого -DgenerateBackupPoms=false
свойство.
Как вы уже видели, мы должны использовать escape перед $
, чтобы предотвратить любой вид оболочки для расширения информации даже до вызова целей плагина. Теперь более важный момент: Не могли бы вы запомнить всю информацию, необходимую для этого вызова? Я не. Возможны и другие вещи, подобные этому (увеличьте младшую версию на единицу):
mvn build-helper:parse-version versions:set \ -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.nextMinorVersion}.0 \ versions:commit
Это становится все более и более утомительным и подверженным ошибкам. Мы можем улучшить это, используя pom.xml
конфигурация (выдержка).
org.codehaus.mojo versions-maven-plugin major set false ${parsedVersion.nextMajorVersion}.0.0-SNAPSHOT
Итак, теперь вы можете использовать следующий вызов для увеличения основной версии вашего проекта:
$ mvn build-helper:parse-version versions:set@major
Гораздо проще, не так ли? Кроме того, его гораздо легче запомнить и даже проще настроить в любом решении CI/CD, и вам не придется бороться с экранированием в разных средах. Мы можем и дальше совершенствоваться подобным образом:
org.codehaus.mojo versions-maven-plugin major set false ${parsedVersion.nextMajorVersion}.0.0-SNAPSHOT minor set false ${parsedVersion.majorVersion}.${parsedVersion.nextMinorVersion}.0-SNAPSHOT patch set false ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion}-SNAPSHOT
Таким образом, мы можем увеличить младшую версию нашего проекта с помощью:
$ mvn build-helper:parse-version versions:set@minor
Номер патча выглядит следующим образом:
$ mvn build-helper:parse-version versions:set@patch
Возможно, вы заметили небольшую проблему в конфигурации, потому что при каждом выполнении false
дублируется? Это можно решить очень легко, выполнив рефакторинг следующим образом:
org.codehaus.mojo versions-maven-plugin false major set ${parsedVersion.nextMajorVersion}.0.0-SNAPSHOT minor set ${parsedVersion.majorVersion}.${parsedVersion.nextMinorVersion}.0-SNAPSHOT patch set ${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.nextIncrementalVersion}-SNAPSHOT
Это лишь некоторые примеры того, как можно настроить вызов командной строки с помощью параметров конфигурации в Maven. Я надеюсь, что это немного помогло.
Оригинал: “https://dev.to/khmarbaise/maven-plugin-configuration-the-unknown-tiny-details-1emm”