如何在自定义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
相关产品推荐
相关产品推荐

