Gradle 7.5.1中DuplicatesStrategy.INHERIT设置无效问题求助
问题
在Gradle 7.5.1项目中,执行以下processResources任务时出现重复文件错误:
processResources { with copySpec { from "src/main/resources/" } }
资源文件夹下包含application.properties、application-dev.properties、application-test.properties文件,错误提示如下:
Entry application-dev.properties is a duplicate but no duplicate handling strategy has been set.
尝试添加全局配置解决问题,使用DuplicatesStrategy.INCLUDE时项目可正常运行:
allprojects { tasks.withType(Copy).all { duplicatesStrategy = DuplicatesStrategy.INCLUDE } }
但将INCLUDE替换为INHERIT后,错误再次出现。查看DuplicatesStrategy枚举确认INHERIT是有效值:
package org.gradle.api.file; public enum DuplicatesStrategy { INCLUDE, EXCLUDE, WARN, FAIL, INHERIT; private DuplicatesStrategy() { } }
请问如何正确配置DuplicatesStrategy.INHERIT策略?
解答
INHERIT策略的核心是继承父级CopySpec的重复文件处理规则,而非直接定义具体处理逻辑。如果父级未设置明确策略,INHERIT会回退到Gradle默认的FAIL行为,这就是替换后错误重现的原因。正确使用方式分两种场景:
1. 全局设置基础策略,任务级继承
先为所有Copy类型任务设置一个基础处理策略,再让特定任务通过INHERIT继承该规则:
allprojects { tasks.withType(Copy).configureEach { // 全局设置默认策略为INCLUDE duplicatesStrategy = DuplicatesStrategy.INCLUDE } } processResources { // 继承全局的INCLUDE策略 duplicatesStrategy = DuplicatesStrategy.INHERIT with copySpec { from "src/main/resources/" } }
2. 嵌套CopySpec继承外层任务策略
在嵌套的copySpec中使用INHERIT,会直接继承外层processResources任务的策略:
processResources { // 给当前任务设置基础策略 duplicatesStrategy = DuplicatesStrategy.INCLUDE with copySpec { // 继承外层任务的INCLUDE策略 duplicatesStrategy = DuplicatesStrategy.INHERIT from "src/main/resources/" } }
注意
直接全局设置duplicatesStrategy = DuplicatesStrategy.INHERIT会失效,因为所有Copy任务没有父级CopySpec提供策略,最终会回退到默认的FAIL规则,触发重复文件错误。
内容的提问来源于stack exchange,提问作者mahfuj asif
相关产品推荐
相关产品推荐

