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

Gradle1.12/2.0自定义插件TaskConfigPlugin扩展值为空如何解决

核心问题原因

你遇到的空值问题是Gradle配置阶段的执行顺序导致的:

  1. 执行apply plugin: 'TaskConfigPlugin'时,会先运行插件apply方法的全部代码,此时你脚本里的taskOrder {}配置块还没执行,扩展属性全是默认的null
  2. 如果你之前用afterEvaluate不生效,大概率是你还是在apply阶段就提前读取了扩展属性存到成员变量,没有在afterEvaluate回调中实时读取扩展的最新值。

Gradle 1.12 兼容解决方案

把所有依赖扩展属性的逻辑全部挪到project.afterEvaluate回调中执行,不要在apply方法中提前读取扩展值,修改后的插件代码如下:

import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;

public class TaskConfigPlugin implements Plugin<Project> {

    @Override
    public void apply(Project project) {
        final TaskConfigPluginExtension extension = project.getExtensions()
                .create("taskOrder", TaskConfigPluginExtension.class);

        // 所有用到扩展属性的逻辑全放到afterEvaluate回调中
        project.afterEvaluate(new Action<Project>() {
            @Override
            public void execute(Project p) {
                // 在这里才读取扩展属性,此时taskOrder配置块已经执行完成,值已经被赋值
                String taskPrefix = extension.getTaskPrefix();
                Task mainTask = extension.getMainTask();
                configureTaskOrdering(p, taskPrefix, mainTask);
            }
        });
    }


    private void configureTaskOrdering(Project project, String taskPrefix, Task mainTask){
        // 判空逻辑自己加,防止用户没配置就运行
        if (taskPrefix == null || mainTask == null) {
            project.getLogger().warn("taskOrder扩展未配置完整,任务排序逻辑跳过");
            return;
        }
        // 原来的任务排序逻辑不变,用传入的taskPrefix和mainTask即可
    }
}

补充说明

  • 这个方案不需要依赖高版本的Provider/Property API,完全兼容Gradle 1.12/2.0版本
  • afterEvaluate回调会在整个项目配置阶段全部完成后执行,此时不仅扩展的配置值已经写入,脚本中定义的mainConsumer任务也已经创建完成,不会出现任务引用无效的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:57:04