Ответ 1
Когда вы запускаете Maven из командной строки, он проходит через несколько этапов. Вот псевдоописание этих этапов, я намеренно упрощаю точное упорядочение (с риском сказать немного неправильные/не по порядку), чтобы вы могли понять, почему то, что вы пытаетесь сделать, не может работать.
-
Сначала он анализирует вашу командную строку, любые свойства, определенные в командной строке с помощью
-Dname=value
, вводятся вMavenSession
-
Параметры, определяющие параметры командной строки, проверяются, чтобы решить, какой должен быть список проектов для создания (также известный как реактор).
-N
означает, что только корневой каталогpom.xml
,-pl
позволяет указать список модулей для сборки,-am
и-amd
позволяет добавлять модули вверх или вниз по течению, соответственно, из тех, которые определены-pl
. Maven не проанализировал файлыpom.xml
в этот момент времени. -
Правила активации профиля
-P
анализируются, чтобы узнать, какие профили активировать. -
Теперь у Maven достаточно знаний, чтобы начать синтаксический анализ файлов
pom.xml
. Он начинается с загрузки и разбора корняpom.xml
, то есть одного в текущем каталоге (или если вы указали альтернативныйpom.xml
с-f
, а затем тот). Этот начальный синтаксис просто концентрируется на определении списка проектов для сборки. Активация профиля учитывается только в той мере, в какой это может повлиять на список доступных<modules>
. Идентификаторы группы Id, Artifact Id, Version и Packaging вpom.xml
не могут содержать свойства, поскольку синтаксический анализ свойств вpom.xml
не состоялся в этот момент времени. (Наблюдательный читатель также увидит, что это также объясняет, почему вы не можете активировать профили на основе свойств вpom.xml
, так как на этом этапе были проанализированы только системные свойства) -
После того, как набор проектов был проверен, Maven теперь выполняет более синтаксический анализ этих
pom.xml
файлов для создания списка расширений сборки (если есть) и списка плагинов. На этом этапе синтаксический анализ требует оценки<properties>
в каждом проекте, так что это когда они оцениваются и "вводятся" в эффективную модель. Таким образом, вы можете использовать свойства системы и свойства pom для определения координат и дополнительных зависимостей внутри (xpath)/project/build/extensions
,/project/build/pluginManagement/plugins/plugin
,/project/build/pluginManagement/plugins/plugin/dependencies
,/project/build/plugins/plugin
и/project/build/plugins/plugin/dependencies
. -
Теперь Maven начинает разбор списка целей и фаз, указанных в командной строке. Частично заданные цели оцениваются для соответствия списку плагинов. Матч должен быть уникальным для всех проектов, с которыми будет выполняться цель плагина (т.е. Если это цель агрегатора, совпадение требуется только в корне, но для всех других "нормальных" целей короткое имя плагина должно быть тот же плагин для всех проектов). Фазы жизненного цикла должны быть из одного из жизненных циклов по умолчанию или из жизненного цикла, определенного в расширении сборки.
-
Из проанализированного списка целей и этапов Maven строит план сборки, т.е. что он собирается делать, на каких проектах и в каком порядке. Для этого Maven должен проанализировать список зависимостей проектов, определенных в файлах проектов
pom.xml
. Это связано с тем, что зависимость может создаваться другим проектом внутри реактора, тем самым вызывая последовательность выполнения проекта. Таким образом, вы можете использовать свойства системы и свойства pom для определения координат и дополнительных зависимостей внутри (xpath)/project/dependencyManagement/dependencies/dependency
и/project/dependencies/dependency
, но обратите внимание, что на данный момент плагины не были выполнены. -
Теперь, когда Maven имеет план сборки, он начинает следовать этому плану в том порядке, в котором он был построен. Если первой целью/фазой в CLI была цель, то эта цель будет вызвана. Если первая цель/фаза была фазой от жизненного цикла сборки по умолчанию, то Maven начнет с фазы
initialize
и выполнит все плагины, привязанные к этой фазе... продолжая аналогичным образом по списку фаз, а затем список проектов. Также обратите внимание, что фазаinitialize
выполняется только как часть жизненного цикла сборки по умолчанию. Он не выполняется в стандартных жизненных циклах по умолчанию или по умолчанию, и он не выполняется ни на каких пользовательских жизненных циклах. (Наблюдательный читатель сделает вывод, что это указывает на еще одну проблему с техникой, которую пытается решить этот вопрос). Примечание: имейте в виду, что цели агрегатора образуют "перерыв" в реакторе, поэтому, если вы попросите Maven запуститьclean package foo:bar site
, гдеfoo:bar
является целью агрегатора mojo, тогдаclean package
будет выполняться со всеми проектами в реактор, тоfoo:bar
будет работать против корня, тогдаsite
будет работать против всех проектов в реакторе. Другими словами, план построения будет обеспечивать самый продолжительный непрерывный запуск целей и фаз не-агрегатора, разделенных на самые длительные непрерывные цепочки агрегаторов. -
Прежде чем он вызовет каждое mojo (т.е. цель привязана к фазе или непосредственно указана в командной строке), Maven оценивает
pom.xml
для эффективного<configuration>
этого mojo. На этом этапе Maven имеет доступ к свойствам системы, свойствам, указанным в pom, и любым свойствам, введенным вMavenSession
ранее выполненными mojos. Таким образом,<configuration>
может ссылаться на любое из этих свойств...Помимо
Теперь есть оговорка... если вы скажете set (xpath)
/project/build/directory
на${some-property-i-will-set-via-a-mojo}
, а затем ссылаетесь на это из вашего<configuration>
, ну, печальная новость заключается в том, что (xpath)/project/build/directory
будет оценивается в эффективномpom.xml
перед любым исполнением плагина, поэтому${project.build.directory}
будет выдано буквальное значение${some-property-i-will-set-via-a-mojo}
и имеет типjava.io.File
вMavenProject
, так что вы на самом деле имели место, этоnew File(project.getBaseDir(),"${some-property-i-will-set-via-a-mojo}")
. Если поле<configuration>
, которое вы вводите, имеет типFile
, не потребуется никакого преобразования типа, и, следовательно, значение будет вводиться прямо, и никакая замена свойства не будет иметь места.Существуют и другие случаи кросс, как описано выше, но в целом замена свойств будет работать с свойствами "вложенных в mojo" (например, такими, которые предоставляются Mojo Свойства Maven Plugin) в разделах
<configuration>
. Он не будет работать за пределами этих разделов.
Итак, это быстрое правило Stephen для разных типов свойств:
Свойства системы
Они работают повсюду... но чрезвычайно опасны в /project/(parent/)?/(groupId|artifactId|version|packaging)
, так как вы не можете контролировать, что когда-либо будет определено, какие свойства системы будут определены при втягивании проекта в качестве транзитивной зависимости. Использование расширения ${...}
в пределах /project/(parent/)?/(groupId|artifactId|version|packaging)
должно рассматриваться как эквивалентное вождению автомобиля при 200 км/ч с металлическим шипом на 30 см (12 дюймов), выступающим с рулевого колеса вместо подушки безопасности... ох и без ремня безопасности.. и у вас только что было 10 единиц алкоголя и две линии кокаина.
pom.xml
свойства (и settings.xml
свойства)
Они работают в большинстве мест, но никогда не доступны в /project/(parent/)?/(groupId|artifactId|version|packaging)
(поскольку они не были проанализированы, когда эти поля оцениваются) и недоступны для рассмотрения активных профилей (опять же, поскольку они не были проанализированы, когда проверка профиля)
Введенные свойства Mojo
Они работают в разделах <configuration>
и могут (из-за рекурсивной интерполяции введенных параметров Mojo String
) работать при косвенном использовании, но с учетом неопределенности рекомендуется ограничить их использование секцией <configuration>
только для плагинов и отчетов.
Последняя вещь
Подумайте, что произойдет, когда ваш проект указан как зависимость. Если вы указали свои зависимости, используя mojo, чтобы вытащить файлы из файла .properties
на диск, Maven не имеет возможности реплицировать это, когда ваша зависимость была вытащена из репозитория Maven. Таким образом, Maven не сможет определить зависимости. Таким образом, он никогда не сможет работать.
Что вы можете сделать, это использовать внешнюю систему (например, ANT) для генерации pom.xml
из шаблона с замененными версиями в этот файл. А затем используйте созданный экземпляр шаблона.