如何在依赖解析之前运行 Maven 插件

Posted

技术标签:

【中文标题】如何在依赖解析之前运行 Maven 插件【英文标题】:How to get a Maven plugin to run before Dependency Resolution 【发布时间】:2022-02-03 04:56:33 【问题描述】:

对此有一个先前的答案,但我不认为accepted answer is correct

我创建了一个 Maven 插件,它基于版本的某些方面以编程方式“摆弄”<repositories><distributionManagement> 配置(因此,如果版本附加了分支名称,即 1.0.0-RC1)。这允许在功能分支构建中使用单独的 Nexus 存储库,而无需在合并回 int 之前修改 POM。

我不能只更改分支构建的 groupId,因为这是一个 OSGi 项目,并且 groupId 必须与源包完美匹配。

问题在于,在依赖解析之前似乎没有运行 maven 生命周期的任何部分。因此,为解析提供正确的<repository> 的目标永远不会被配置,所以 Maven 只是抱怨它无法解析。

链接的答案表明“干净”在解决之前运行,但这似乎不是真的。如果我将我的目标配置为具有“清理”或“验证”的默认阶段,则似乎仍会首先解决。

我可以让我的插件目标在依赖解析之前运行吗?

编辑:这似乎无法做到。我认为这需要在 Maven 中修复。在依赖解析之前,应该有地方运行需要“项目”的插件,而不必在 Plexus 中钻研。这将允许在后续解析期间使用的存储库列表的动态配置。大概这需要在 EventDispatcher 实现中的某个地方进行更改(我注意到它已被弃用?)。

【问题讨论】:

您是否尝试在 pre-clean 阶段执行您的插件? 接下来我会尝试.. 现在发生了一些奇怪的事情,插件似乎不再运行了。当我让它再次运行时,我会告诉你会发生什么。 @heRoy No. pre-clean 仍然在依赖解析之后。这令人沮丧。 Maven 允许您以编程方式更改插件中的存储库列表,但不提供任何有意义的阶段! 你能解决这个问题吗?我发现自己需要在工件解析之前执行一个插件,因为该插件实际上会在本地安装一些工件,并且由于工件丢失错误而没有机会这样做! @Asu 没有。我甚至在 Maven 的积压工作中提出了一个请求,但它被挡住了。我可以自己修补它,这是一个单行修复。这令人沮丧。 maven 开发人员似乎有点小圈子。这是很久以前的事了。也许你应该尝试解决这个问题,也许你现在会有更多的运气?祝你好运。 【参考方案1】:

我建议查看EventSpy in Maven,其中有artifact resolution 或RepositoryEvent.EventType 的此类事件,但这不能作为插件使用。

“onEvent”的实现可能如下所示:

@Override
public void onEvent( Object event )
    throws Exception

    try
    
        if ( event instanceof ExecutionEvent )
        
            executionEventHandler( (ExecutionEvent) event );
        
        else if ( event instanceof RepositoryEvent )
        
            repositoryEventHandler( (RepositoryEvent) event );
        
        else if ( event instanceof MavenExecutionRequest )
        
            executionRequestEventHandler( (MavenExecutionRequest) event );
        
        else if ( event instanceof MavenExecutionResult )
        
            executionResultEventHandler( (MavenExecutionResult) event );
        
        else if ( event instanceof DependencyResolutionRequest )
        
            dependencyResolutionRequest( (DependencyResolutionRequest) event );
        
        else if ( event instanceof DependencyResolutionResult )
        
            dependencyResolutionResult( (DependencyResolutionResult) event );
        
    
    catch ( Exception e )
    
        logger.error( "Exception", e );
    

在哪里

【讨论】:

如何实现 AbstractEventSpy 使其成为我构建的一部分? 您必须创建一个 jar 文件,该文件将位于 '$MAVEN_HOME/lib/ext' 文件夹中。

以上是关于如何在依赖解析之前运行 Maven 插件的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用任何插件的情况下将非 maven 依赖项安装到您的 maven 项目中? [复制]

Maven 如何解析插件版本?

如何使用maven依赖插件将类型为pom的依赖项复制到一个位置

maven插件加载依赖的类

如何在插件中访问 Maven 的依赖层次结构

Maven Java API:独立依赖解析(即不是 Maven 插件)