Gradle允许重复sourceSets:dev资源覆盖主资源配置问题
解决Gradle中Dev资源覆盖主资源的问题
问题核心
你需要让src/main/resources-dev下的资源覆盖src/main/resources中的同名资源,但直接将dev资源目录添加到main的sourceSet时,Gradle因默认不处理重复文件报错。直接修改普通Copy任务的duplicateStrategy无效,是因为资源打包的核心任务是processResources,需针对它配置。
可行解决方案
方案1:通过SourceSet目录优先级控制
Gradle中后添加的资源目录优先级更高,会覆盖先添加目录的同名文件,配合processResources任务的重复策略即可实现需求:
sourceSets { main { resources { // 先声明主资源目录 srcDir "src/main/resources" // 后声明dev资源目录,优先级更高 srcDir "src/main/resources-dev" } } } // 给资源处理核心任务设置重复策略 tasks.named('processResources') { duplicatesStrategy = DuplicatesStrategy.REPLACE }
方案2:单独创建Dev SourceSet(更易维护)
如果需要更清晰地区分环境资源,可以单独定义dev sourceSet,再让main依赖其资源:
sourceSets { dev { resources { srcDir "src/main/resources-dev" } } main { resources { srcDir "src/main/resources" // 引入dev资源并让其覆盖main资源 source dev.resources } } } tasks.named('processResources') { duplicatesStrategy = DuplicatesStrategy.REPLACE }
关键说明
DuplicatesStrategy.REPLACE会让优先级高的目录(后添加/引入的)中的资源覆盖同名文件,完全匹配你的需求。- 必须针对
processResources任务配置重复策略,因为Gradle的资源打包流程由该任务主导,普通Copy任务不参与核心资源处理。
内容的提问来源于stack exchange,提问作者SvenWollinger
相关产品推荐
相关产品推荐

