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

如何在自定义Gradle插件中获取Java项目的资源目录路径

实现方案

你可以通过Java插件提供的SourceSet配置获取resources目录,推荐使用惰性配置的方式在插件注册Task时传入路径,避免Task与Project强耦合,符合Gradle官方开发规范:

第一步:修改CustomTask定义

在Task内声明输入目录属性,用来接收插件传递的resources路径:

import org.gradle.api.DefaultTask;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.tasks.InputDirectory;
import org.gradle.api.tasks.TaskAction;
import java.io.File;

public class CustomTask extends DefaultTask {

    // 声明接收resources目录的属性
    private final DirectoryProperty resourcesDir;

    @Inject
    public CustomTask() {
        this.resourcesDir = getProject().getObjects().directoryProperty();
    }

    @InputDirectory
    public DirectoryProperty getResourcesDir() {
        return resourcesDir;
    }

    @TaskAction
    public void execute() {
        // 此处即可直接读取resources目录路径
        File resourcesPath = resourcesDir.get().getAsFile();
        System.out.println("Resources目录路径:" + resourcesPath.getAbsolutePath());
    }

}

第二步:修改插件代码,注册Task时传入resources路径

需要先获取Java插件的SourceSet容器,从中读取对应源码集的resources目录:

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetContainer;

public class MyCustomPlugin implements Plugin<Project> {

    @Override
    public void apply(Project project) {
        // 确保项目应用了Java插件,否则无法读取SourceSet配置
        project.getPlugins().apply(JavaPlugin.class);
        
        // 获取SourceSet容器
        SourceSetContainer sourceSets = project.getExtensions().getByType(SourceSetContainer.class);
        SourceSet mainSourceSet = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME);
        
        // 注册Task并绑定resources目录
        project.getTasks().register("doStuff", CustomTask.class, task -> {
            // 获取原始源码resources目录(src/main/resources)用这行
            task.getResourcesDir().set(mainSourceSet.getResources().getSrcDirs().iterator().next());
            // 如果需要获取构建后处理完成的resources目录(build/resources/main),替换为下面这行
            // task.getResourcesDir().set(mainSourceSet.getOutput().getResourcesDir());
        });
    }
}

额外说明

  • 若需要获取测试源码集的resources目录,只需将SourceSet.MAIN_SOURCE_SET_NAME替换为SourceSet.TEST_SOURCE_SET_NAME即可
  • 虽然直接在Task构造函数中获取Project实例读取路径也可实现,但不符合Gradle配置缓存规范,更推荐使用上述惰性传参方案

内容的提问来源于stack exchange,提问作者Sam Jing Wen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:57:02