我想动态分配我的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版本?
答案 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>
在依赖项和项目版本中(这对我来说都很不错;-)