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

Gradle 7迁移应用maven-publish报错:项目已评估无法执行afterEvaluate

问题根源

Gradle 7.0+ 新增了限制:项目评估完成后不允许再调用afterEvaluate方法。你遇到报错是因为执行顺序错误:

  1. 根目录build.gradle先定义了publishAll任务,任务配置阶段遍历所有子项目查找publish开头的任务,这个操作会触发子项目提前完成评估
  2. 之后才执行apply from: 'publish.gradle'给指定子项目应用maven-publish插件,而该插件内部会调用afterEvaluate做初始化,此时子项目已经评估完成,直接触发报错

修复步骤

  1. 调整根目录build.gradle的代码顺序
    把apply from: 'publish.gradle'移动到publishAll任务定义之前,确保子项目的插件配置在任务遍历之前完成:
// 原有allprojects配置不变
allprojects {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
        maven {
            url = uri("...")
            credentials {
                username = properties.getProperty("...")
                password = properties.getProperty("...")
            }
        }
    }
}

apply plugin: 'android-reporting'

// 新增:先应用publish配置,再定义publishAll任务
apply from: 'publish.gradle'

task publishAll() {
    subprojects.each { pr ->
        dependsOn {
            pr.tasks.findAll { task -> task.name.startsWith('publish') }
        }
    }
    outputs.upToDateWhen { false }
}
// 后面的clean任务等保持不变

如果调整顺序后仍然报错,可以优化publishAll的写法,避免提前触发子项目评估:

task publishAll {
    outputs.upToDateWhen { false }
}

// 等所有项目都评估完成后再添加依赖
gradle.projectsEvaluated {
    subprojects.each { pr ->
        publishAll.dependsOn pr.tasks.matching { it.name.startsWith('publish') }
    }
}
  1. 移除重复的插件应用
    你的子项目build.gradle已经声明了com.android.library插件,可以去掉publish.gradle里的apply plugin: 'com.android.library'行,避免重复配置带来的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 03:42:03