自定义Gradle插件中FatJarTask的duplicatesStrategy失效问题排查
Gradle自定义插件FatJarTask重复策略失效问题分析
核心原因
问题出在插件中任务配置的时机错误,或者任务类的初始化逻辑未在Gradle配置阶段生效:
- 若你在自定义
FatJarTask的@TaskAction方法内设置duplicatesStrategy,这段代码只会在任务执行阶段运行,而Gradle在配置阶段就会检查Jar任务的重复项规则,此时策略还是默认值,自然触发错误。 - 当任务类写在项目
build.gradle.kts时,Gradle会直接在配置阶段完成任务初始化,设置的策略能及时生效,不会出现延迟。
解决方法
方法1:在任务类初始化阶段设置策略
修改插件中的FatJarTask类,把重复策略放在类的初始化块(init)中,确保配置阶段就能生效:
abstract class FatJarTask : Jar() { init { // 配置阶段就设置重复策略 duplicatesStrategy = DuplicatesStrategy.EXCLUDE // 其他FatJar相关配置,比如合并依赖等 from(project.configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) }) } @TaskAction override fun copy() { // 自定义执行逻辑(如果需要) super.copy() } }
方法2:在插件注册任务时显式配置
如果任务类的初始化逻辑无法修改,在插件注册任务的代码中再次明确设置策略,覆盖默认配置:
class CustomFatJarPlugin : Plugin<Project> { override fun apply(project: Project) { project.tasks.register<FatJarTask>("fatJar") { // 显式设置重复策略 duplicatesStrategy = DuplicatesStrategy.EXCLUDE // 其他任务配置 } } }
额外排查点
- 检查项目中是否有其他插件(比如
java或第三方插件)修改了Jar任务的全局默认配置,导致自定义任务的策略被覆盖,此时可以在任务配置中显式隔离配置。 - 确认插件的Gradle版本与项目使用的Gradle版本兼容,部分版本对任务配置时机的处理有差异。
内容的提问来源于stack exchange,提问作者expert
相关产品推荐
相关产品推荐

