使用Gradle自定义插件时出现Null property空指针异常该如何解决?
问题根因
你遇到的空指针是因为Gradle没有为扩展接口中的myValue属性自动生成Property实例,核心问题是你将Property类型的属性错误声明为了var,且遗漏了Gradle托管扩展的写法要求,不属于官方文档错误。
Property是Gradle提供的可变值容器,本身支持读写操作,在扩展中仅需要声明为val暴露getter即可,声明为var时Gradle会认为你需要自行管理整个Property实例的赋值,不会自动生成实例。
正确实现方案
方案1:使用抽象类声明扩展(兼容性最好,无需额外配置)
Gradle对抽象类的托管属性支持最稳定,适合大多数场景:
- 修改扩展定义
abstract class MyExtension { // 注意用val而非var abstract val myValue: Property<String> }
- 插件代码无需调整
class MyPlugin : Plugin<Project> { override fun apply(project: Project) { val extension = project.extensions.create<MyExtension>("myExt") } }
build.gradle.kts侧的配置代码保持原有写法即可正常运行。
方案2:手动初始化Property(全版本兼容)
如果你需要完全控制属性初始化,不依赖Gradle自动托管,可以使用该写法:
- 修改扩展定义
class MyExtension(objects: ObjectFactory) { val myValue: Property<String> = objects.property(String::class.java) }
- 调整插件中扩展创建逻辑,传入ObjectFactory实例
class MyPlugin : Plugin<Project> { override fun apply(project: Project) { val extension = project.extensions.create( "myExt", MyExtension::class.java, project.objects ) } }
方案3:接口声明扩展(需满足版本要求)
如果坚持使用接口,需要将属性改为val,且确保插件项目已正确依赖gradleApi()、使用Gradle 6.0+版本:
interface MyExtension { val myValue: Property<String> }
内容的提问来源于stack exchange,提问作者user8681
相关产品推荐
相关产品推荐

