如何解决Gradle构建报错Could not get unknown property 'shadow'
报错产生原因
- 插件与Gradle版本不兼容:
com.github.johnrengelman.shadow4.0.4版本发布时间较早,最高仅支持Gradle 5.x系列版本,和当前使用的Gradle 7.4.2版本完全不兼容。高版本Gradle下加载该版本插件时无法正常完成初始化,不会为Project对象注入shadow扩展属性,后续调用相关属性时就会抛出未知属性错误。 - 插件应用范围错误:在根项目的
plugins块中声明shadow插件时,默认插件仅会生效在根项目上,不会自动应用到子项目。但后续配置逻辑是直接调用子项目的shadow属性,未应用shadow插件的子项目对象上不存在该属性,同样会触发报错。 - 配置结构存在语法问题:贴出的代码中,判断子项目的逻辑没有放在
subprojects {}遍历闭包内,subproject变量本身未被定义,且代码末尾多了一个多余的闭合大括号,也会干扰构建脚本的正常解析。
可行解决方案
按以下步骤调整配置即可修复问题:
- 升级shadow插件到兼容版本
将插件版本替换为适配Gradle 7.x的7.x系列版本,根项目声明插件时增加apply false,避免根项目不必要加载插件:
plugins { id 'com.github.johnrengelman.shadow' version '7.1.2' apply false // 其余根项目需要的插件按原有逻辑保留 }
- 修正子项目配置结构
将子项目相关的发布、shadow配置统一放到subprojects {}闭包内,给需要构建fat jar的子项目正确应用shadow插件,修正后参考配置如下:
subprojects { // 先应用子项目所需的基础插件 apply plugin: 'java' apply plugin: 'maven-publish' apply plugin: 'com.github.johnrengelman.shadow' // 再配置发布逻辑 if (name in gradle.platforms) { publishing { publications { code(MavenPublication) { // 移除原配置中多余的空格,避免语法报错 artifactId = gradle.platforms['artifactName'] from components.java } shadow(MavenPublication) { artifactId = name shadow.component(it) } } } } }
- 可选优化
如果不是所有子项目都需要打shadow包,不需要在subprojects块中统一应用shadow插件,仅在if (name in gradle.platforms)判断成立的分支内给对应子项目应用插件即可,减少不必要的构建开销。
内容的提问来源于stack exchange,提问作者Developer208
相关产品推荐
相关产品推荐

