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
相关产品推荐
相关产品推荐

