【问题标题】:How to get a Maven plugin to run before Dependency Resolution如何在依赖解析之前运行 Maven 插件
【发布时间】: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 开发人员似乎有点小圈子。这是很久以前的事了。也许你应该尝试解决这个问题,也许你现在会有更多的运气?祝你好运。

标签: maven maven-2 maven-3 maven-plugin maven-release-plugin


【解决方案1】:

我建议查看EventSpy in Maven,其中有artifact resolutionRepositoryEvent.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' 文件夹中。
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多