Плагин / расширение 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>

как в зависимости, так и в версии проекта (это было хорошо для меня;-)

Другие вопросы по тегам