IntelliJ加载Gradle变更时调用graph.getAllTasks().last()报空列表错误
问题根因
这个报错不是你的whenReady用法错误,是IntelliJ首次同步Gradle项目的特殊机制导致的:
- IntelliJ执行Gradle同步操作时,仅会解析项目结构、解析依赖坐标,不会生成完整的任务执行链路,此时
graph.getAllTasks()返回的是空列表,直接调用last()就会触发空集合异常 - 命令行执行Gradle任务、以及IntelliJ中后续运行Gradle任务时,都会生成完整任务图,所以不会触发该问题
修复方案
方案1:给原有逻辑增加空校验
直接在调用last()前判断任务列表是否非空,即可兼容IntelliJ同步场景:
gradle.getTaskGraph().whenReady { graph -> def allTasks = graph.getAllTasks() if (!allTasks.isEmpty()) { allTasks.last().doLast { // 你原有打印时间戳的逻辑 println "所有任务执行完成时间戳:${System.currentTimeMillis()}" } } }
方案2:使用更通用的构建结束钩子
如果你的需求是打印整个构建执行完成的时间戳,直接用Gradle自带的buildFinished生命周期钩子更稳妥,不需要依赖任务图的内容:
gradle.buildFinished { result -> // 可以根据result判断构建是否成功,按需打印 println "构建执行完成时间戳:${System.currentTimeMillis()}" println "构建状态:${result.success ? '成功' : '失败'}" }
内容的提问来源于stack exchange,提问作者bernieslearnings
相关产品推荐
相关产品推荐

