创建按指定顺序执行多子任务的Gradle自定义任务遇空指针问题
解决Gradle自定义任务空指针异常及任务引用问题
空指针异常的根源
你碰到的Cannot invoke method mustRunAfter() on null object错误,本质是调用mustRunAfter()的目标任务为null——要么是任务路径/名称写错了,要么是配置myNewTask时,依赖的目标任务还没被Gradle初始化出来。Gradle采用懒加载任务模型,配置阶段直接硬编码引用子模块任务,很可能因任务未创建导致找不到,返回null。
正确的自定义任务配置
用tasks.named()或tasks.findByPath()延迟获取任务,确保任务实际创建后再建立依赖/顺序关系,示例如下:
简洁聚合任务写法(仅执行指定任务,无自定义动作)
tasks.register('myNewTask') { group = 'custom' description = '一键执行所有构建相关任务' // 直接列出要执行的所有任务全路径/名称 dependsOn 'build', 'checkStats', ':project:module:verify', ':project:module:createJar', ':project:module:createOApi', ':project:module:setupConfigs', 'deploy' // 如果需要强制指定执行顺序,比如myNewTask必须在build之后执行(可选) mustRunAfter 'build' }
更安全的延迟引用写法(适合复杂场景)
// 注册自定义任务 def myNewTask = tasks.register('myNewTask') { group = 'custom' description = '一键执行所有构建相关任务' doLast { println '所有指定任务执行完成' } } // 延迟配置依赖和执行顺序,确保目标任务已创建 myNewTask.configure { dependsOn( tasks.named('build'), tasks.named('checkStats'), tasks.findByPath(':project:module:verify'), tasks.findByPath(':project:module:createJar'), tasks.findByPath(':project:module:createOApi'), tasks.findByPath(':project:module:setupConfigs'), tasks.named('deploy') ) // 若要指定顺序,确保引用的任务存在 mustRunAfter tasks.named('build') }
关于:project:module:task格式的引用
完全可以直接用这种全路径格式引用子模块任务,但要满足三个前提:
- 子模块
project:module已经在settings.gradle中通过include ':project:module'正确配置。 - 任务名称和路径完全匹配(Gradle任务名称大小写敏感,别写错)。
- 优先用
tasks.findByPath()或tasks.named()来引用,而非直接硬编码——前者在任务不存在时返回null,后者会抛出明确的错误提示,方便排查问题。
排查小技巧
- 先单独执行每个目标任务,比如
./gradlew :project:module:verify,确认任务能正常运行,排除任务本身不存在或路径错误的问题。 - 检查
settings.gradle,确保子模块已被正确包含。 - 如果用Kotlin DSL,语法略有差异,但核心逻辑一致,比如用
tasks.named<DefaultTask>("myNewTask")。
内容的提问来源于stack exchange,提问作者SyncMaster
相关产品推荐
相关产品推荐

