You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven聚合型Mojo引发多模块依赖范围解析异常问题咨询

Maven聚合Mojo触发依赖提前解析导致快照版本未被优先使用的问题

问题背景

  • 项目采用100+模块的Maven多模块架构,全量构建耗时超1小时,因此使用gitflow-incremental-builder插件实现增量构建:
    • PR构建仅构建变更模块及其依赖模块
    • CI流水线中,PR构建成功后通过maven-release-plugin仅构建变更模块的发布jar包并部署至Azure Artifacts
  • 项目大量使用依赖范围依赖自研jar包,社区对依赖范围与快照版本的关系长期存在分歧,这可能是问题成因之一

异常现象

PR构建时,依赖未解析成本次构建前期生成的本地快照版本(如1.2.3-SNAPSHOT,版本比远程仓库的旧正式版1.2.2更新),反而解析为Azure远程仓库的最新正式版,导致构建失败。

调试分析

对Maven调试后发现,执行聚合型Mojo(本项目中为serenity-maven-plugin的aggregate-goal)会触发所有尚未解析依赖的模块提前解析依赖,且该操作发生在模块构建中途,后续不会重新解析依赖范围,从而遗漏本次构建后期生成的快照jar包。

问题出在Maven核心代码org.apache.maven.lifecycle.internal.MojoExecutor.java:252处,关键代码片段如下:

public void ensureDependenciesAreResolved(MojoDescriptor mojoDescriptor, MavenSession session, DependencyContext dependencyContext) throws LifecycleExecutionException {
        MavenProject project = dependencyContext.getProject();
        boolean aggregating = mojoDescriptor.isAggregator();
        Collection scopesToCollect;
        Collection scopesToResolve;
        if (dependencyContext.isResolutionRequiredForCurrentProject()) {
            scopesToCollect = dependencyContext.getScopesToCollectForCurrentProject();
            scopesToResolve = dependencyContext.getScopesToResolveForCurrentProject();
            this.lifeCycleDependencyResolver.resolveProjectDependencies(project, scopesToCollect, scopesToResolve, session, aggregating, Collections.emptySet());
            dependencyContext.synchronizeWithProjectState();
        }

        Iterator var8;
        MavenProject aggregatedProject;
        if (aggregating) {
            scopesToCollect = this.toScopes(mojoDescriptor.getDependencyCollectionRequired());
            scopesToResolve = this.toScopes(mojoDescriptor.getDependencyResolutionRequired());
            if (dependencyContext.isResolutionRequiredForAggregatedProjects(scopesToCollect, scopesToResolve)) {
                var8 = session.getProjects().iterator();

                while(var8.hasNext()) {
                    aggregatedProject = (MavenProject)var8.next();
                    if (aggregatedProject != project) {
                    // !!!! 开始解析当前Maven会话中的所有项目依赖 !!!!
                    this.lifeCycleDependencyResolver.resolveProjectDependencies(aggregatedProject, scopesToCollect, scopesToResolve, session, aggregating, Collections.emptySet());
                    }
                }
            }
        }

临时解决方案

由于该Mojo仅用于生成target目录下与Cucumber测试相关的HTML报告,目前已暂时移除该插件配置以规避问题。

疑问与预期行为

不确定此问题是Maven Bug还是使用方式不当,故先咨询而非直接提交至Apache JIRA。

预期行为:模块POM中的依赖范围不应在模块自身构建完成前解析为实际版本。


内容的提问来源于stack exchange,提问作者Valtteri Takala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:04:53