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

如何在Gradle自定义插件中关联ExtraPropertiesExtension与自定义扩展

在自定义Gradle插件中关联ext(ExtraPropertiesExtension)到自定义扩展

问题场景

你需要让自定义Gradle扩展customExtension支持ext块配置,就像构建脚本中写的这样:

customExtension {
    name = 'name'
    ext {
        set('url', 'https://...')
    }
}

目前已完成name属性的配置,但不知道如何处理ext部分,实现ExtraPropertiesExtension与自定义扩展的关联。

解决方案

1. 让自定义扩展类实现ExtensionAware接口

Gradle的ExtensionAware接口是实现嵌套扩展的核心,它允许自定义扩展拥有自己的扩展容器,从而能添加ext扩展。修改你的CustomExtension类:

import org.gradle.api.ExtensionAware;
import org.gradle.api.internal.DefaultExtensionAware;

public class CustomExtension implements ExtensionAware {
    // 委托给DefaultExtensionAware处理扩展容器逻辑
    private final DefaultExtensionAware extensionDelegate = new DefaultExtensionAware();
    private String name;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    // 实现ExtensionAware接口的方法,委托给内部实例
    @Override
    public <T> T getExtensions() {
        return extensionDelegate.getExtensions();
    }
}

2. 在插件中为自定义扩展注册ext扩展

在插件的apply方法中,创建并注册自定义扩展后,为它添加ExtraPropertiesExtension(即ext):

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.plugins.ExtraPropertiesExtension;

public class CustomPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        // 创建并注册自定义扩展
        CustomExtension customExtension = project.getExtensions().create("customExtension", CustomExtension.class);

        // 为自定义扩展注册ext扩展
        customExtension.getExtensions().create("ext", ExtraPropertiesExtension.class);

        // 配置默认值(可选)
        project.getExtensions().configure(CustomExtension.class, ext -> {
            ext.setName("defaultName");
            // 给ext设置默认属性
            ((ExtraPropertiesExtension) ext.getExtensions().getByName("ext")).set("defaultUrl", "https://default.example.com");
        });
    }
}

3. 验证配置效果

在构建脚本中配置后,可以通过以下方式获取ext中的属性:

task printExtProps {
    doLast {
        println customExtension.name
        println customExtension.ext.url
    }
}

关键说明

  • ExtensionAware是Gradle实现扩展嵌套的基础,所有需要支持子扩展的类都应实现该接口。
  • ExtraPropertiesExtension是Gradle内置扩展,专门用于存储自定义额外属性,对应构建脚本中的ext块。
  • 委托给DefaultExtensionAware是最简便的实现方式,无需自行编写扩展容器的复杂逻辑。

内容的提问来源于stack exchange,提问作者e.danilenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:12:17