Gradle 7.5升级至8.0后project.afterEvaluate异常求助
解决方案:Gradle 8.0嵌套扩展属性获取问题
问题根源
Gradle 8.0对扩展配置的方法签名规范和嵌套对象初始化逻辑做了严格校验,你的Object1类存在两个核心问题:
- 嵌套对象配置方法缺失:
build.gradle中用闭包配置object2,但Object1仅提供了接受Object2实例的object2(Object2)方法,无法解析闭包配置逻辑,导致object2始终未被正确初始化。 - 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
相关产品推荐
相关产品推荐

