Плагин / расширение Maven для динамического обновления версии зависимостей
Я хотел бы динамически назначать версии зависимостей моего проекта Maven (пожалуйста, не спрашивайте почему - я знаю, что это не предпочтительный шаблон). Насколько я понимаю, я должен создать Maven Extension, чтобы добиться этого, так как обычный плагин вызывается слишком поздно.
Итак, я попытался перехватить события Maven в EventSpy, я также попробовал AbstractMavenLifecycleParticipant. Используя их, я могу получать уведомления, но как на самом деле сделать само изменение - как заставить Maven начать работать с этой новой обновленной версией? Я думаю, мне нужно как-то изменить версию зависимости в реакторе Maven.... но как?
Я знаю, что в maven-version-plugin есть решение, но оно потребует двухэтапного задания: сначала манипулируйте pom.xml, а затем запустите реальную сборку. Но мне нужно сделать это в течение одного пробега.
Любая идея, пожалуйста? Заранее спасибо.
РЕДАКТИРОВАТЬ
Пример pom.xml файлов для иллюстрации ситуации
Библиотечный модуль:
my-lib pom.xml
<groupId>foo.bar</groupId> <artifactId>my-lib</artifactId> <version>1.0.5</version>
my-app pom.xml
<groupId>foo.bar</groupId> <artifactId>my-app</artifactId> <version>2.5.0</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> ... <dependency> <groupId>foo.bar</groupId> <artifactId>my-lib</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependencies>
Теперь, когда я собираю свое приложение, мне нужно динамически назначать версию my-lib в соответствии с последней выпущенной версией, которую я нашел в nexus (я знаю, как получить правильную версию - скажем, это 1.0.5). Но как сделать какую-то предварительную обработку, которая изменит версию в реакторе, чтобы Maven затем использовал версию 1.0.5?
1 ответ
ХОРОШО. Похоже, я понял;-) Спасибо khmarbaise за комментарий. Я уже видел эту страницу, но не обратил на это внимания.
Итак, я создал MavenLifecycleParticipant, где я вычисляю нужную версию и устанавливаю ее как пользовательское свойство:
@Component(role = AbstractMavenLifecycleParticipant.class, hint = "my-dep")
public class DependencyLifecycleParticipant extends AbstractMavenLifecycleParticipant
{
@Override
public void afterSessionStart(MavenSession session) throws MavenExecutionException {
session.getUserProperties().setProperty("MyVersion", "1.2.3");
}
}
Теперь в моем pom.xml я могу использовать что-то вроде:
<version>${MyVersion}</version>
как в зависимости, так и в версии проекта (это было хорошо для меня;-)