Maven插件/扩展以动态更新依赖版本

时间:2018-12-18 14:19:48

标签: java maven maven-3 maven-plugin maven-extension

我想动态分配我的Maven项目的依赖版本(请不要问为什么-我知道这不是一个可取的模式)。据我了解,我必须创建Maven Extension才能实现这一点,因为常规插件被调用为时已晚。

因此,我尝试在EventSpy中捕获Maven事件,也尝试了AbstractMavenLifecycleParticipant。通过使用这些通知,我可以得到通知,但是如何实际进行更改-如何使Maven开始使用此新更新版本?我想我需要以某种方式在Maven的反应堆中更改依赖版本。...但是如何?

我知道maven-version-plugin中有解决方案,但这需要将其作为两步工作:首先处理pom.xml,然后运行实际构建。但是我需要在一次Maven运行中完成它。

有什么想法吗?谢谢,谢谢。

编辑

示例pom.xml文件来说明情况

库模块:

  • 我的库pom.xml

    <groupId>foo.bar</groupId>
    <artifactId>my-lib</artifactId>
    <version>1.0.5</version>
    
  • 我的应用程序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>
    

现在,当我构建我的应用程序时,我需要根据在nexus中找到的最新发布版本动态分配my-lib版本(我知道如何获取正确的版本-假设它是1.0.5)。但是如何进行某种预处理以更改反应堆中的版本,以便Maven然后使用1.0.5版本?

1 个答案:

答案 0 :(得分: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>

在依赖项和项目版本中(这对我来说都很不错;-)