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

Gradle 7.5升级至8.0后project.afterEvaluate异常求助

解决方案:Gradle 8.0嵌套扩展属性获取问题

问题根源

Gradle 8.0对扩展配置的方法签名规范和嵌套对象初始化逻辑做了严格校验,你的Object1类存在两个核心问题:

  1. 嵌套对象配置方法缺失:build.gradle中用闭包配置object2,但Object1仅提供了接受Object2实例的object2(Object2)方法,无法解析闭包配置逻辑,导致object2始终未被正确初始化。
  2. Getter方法不符合规范:object2()不符合JavaBean的getter命名规则(应为getObject2()),Gradle 8.0的属性解析机制无法正确识别该属性。

修复步骤

1. 修改Object1类的object2相关实现

更新Object1类,添加支持闭包/Action配置的方法,并修正getter命名:

import org.gradle.api.Action;
import groovy.lang.Closure;
import org.gradle.util.ConfigureUtil;

public class Object1 {
    // ... 原有代码保持不变 ...

    private Object2 object2;

    // 懒加载初始化Object2实例
    private Object2 getOrCreateObject2() {
        if (object2 == null) {
            object2 = project.getObjects().newInstance(Object2.class);
        }
        return object2;
    }

    // 支持Groovy闭包配置object2
    void object2(Closure<?> closure) {
        ConfigureUtil.configure(closure, getOrCreateObject2());
    }

    // 支持Action配置(兼容Groovy/Kotlin DSL,Gradle推荐方式)
    void object2(Action<Object2> action) {
        action.execute(getOrCreateObject2());
    }

    // 符合JavaBean规范的getter方法
    public Object2 getObject2() {
        return object2;
    }

    // 保留原有setter方法做兼容
    void object2(Object2 object2) {
        this.object2 = object2;
    }
}

2. 确保Object2类具备可配置能力

Object2需要为属性提供标准的setter/getter方法,示例:

public class Object2 {
    private String propertie2;
    private String propertie3;
    private String propertie4;

    public void setPropertie2(String propertie2) {
        this.propertie2 = propertie2;
    }

    public String getPropertie2() {
        return propertie2;
    }

    public void setPropertie3(String propertie3) {
        this.propertie3 = propertie3;
    }

    public String getPropertie3() {
        return propertie3;
    }

    public void setPropertie4(String propertie4) {
        this.propertie4 = propertie4;
    }

    public String getPropertie4() {
        return propertie4;
    }
}

3. 修正插件中的属性调用代码

将插件中extension.getobject2()改为extension.getObject2(),匹配修正后的getter方法:

project.afterEvaluate(action -> {
    System.out.println(extension.getpropertie1());
    System.out.println(extension.getObject2());
});

验证效果

修改完成后,无论build.gradle中propertie1和object2的配置顺序如何,Gradle 8.0都能正确解析并获取到属性值,无需将嵌套配置移到外部。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:15:16