news 2026/2/28 10:59:23

Jenkins Pipeline 中的 NotSerializableException: LazyMap 报错 | 3个实用解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Jenkins Pipeline 中的 NotSerializableException: LazyMap 报错 | 3个实用解决方案

大家好!在使用 Jenkins Pipeline 时,你是否遇到过类似以下的报错?

NotSerializableException: groovy.json.internal.LazyMap

这个看似棘手的异常,其实与 Groovy 版本的更新有关。简单来说,从Groovy 2.3起(Jenkins 2.7.1 所用的是 2.4.7),默认的JsonSlurper在解析 JSON 时会返回一种叫LazyMap的结构。它虽然节省内存,却不支持序列化,而 Pipeline 在执行中经常需要序列化数据,因此直接使用就容易抛出异常。

常见问题代码如下:

def jsonResponse = sh(script: 'curl -s http://example.com/api/data', returnStdout: true).trim() def jsonSlurper = new groovy.json.JsonSlurper() def result = jsonSlurper.parseText(jsonResponse) // 这里得到的是 LazyMap println(result) // 触发 NotSerializableException!

别担心,下面为大家分享三个实用的解决方案,帮你轻松绕过此坑。

方案适用场景备注
@NonCPS 注解推荐首选,逻辑独立、不需与 Pipeline 步骤交互时最清晰、最规范
转换为 HashMap只需简单转换,数据结构较平坦时注意嵌套结构的拷贝问题
改用脚本式流水线已在脚本式环境中,或声明式限制过多时灵活,但需注意代码风格统一

简单来说,遇到LazyMap导致的序列化错误时,优先考虑使用@NonCPS注解封装解析逻辑,这通常是最干净、最可持续的做法。


解决方案一:使用 @NonCPS 注解(推荐)

这是最直接、最推荐的做法。
通过在方法上添加@NonCPS注解,可以告诉 Jenkins 这个方法内的操作不需要参与序列化,从而允许使用LazyMap等非序列化对象。

示例:

@NonCPS def parseJson(String jsonText) { return new groovy.json.JsonSlurper().parseText(jsonText) } node { def jsonResponse = sh(script: 'curl -s http://example.com/api/data', returnStdout: true).trim() def result = parseJson(jsonResponse) // 安全,不会触发异常 println(result) }

小贴士:
@NonCPS方法内应尽量保持纯 Groovy 逻辑,避免调用 Jenkins Pipeline 的步骤(如sh,echo等)。


解决方案二:将 LazyMap 转换为可序列化的 Map

如果不想用@NonCPS,也可以手动将LazyMap转换为标准的、可序列化的HashMap

示例:

def jsonResponse = sh(script: 'curl -s http://example.com/api/data', returnStdout: true).trim() def jsonSlurper = new groovy.json.JsonSlurper() def lazyMap = jsonSlurper.parseText(jsonResponse) def serializableMap = new HashMap<>(lazyMap) // 关键转换 println(serializableMap) // 现在可以安全使用了

注意:这种方式对于嵌套较深的 JSON 结构是浅拷贝,如果内层仍有LazyMap,可能仍需递归转换。


解决方案三:改用脚本式流水线(Scripted Pipeline)

如果你在使用声明式流水线(Declarative Pipeline),可以尝试在特定阶段切回脚本式流水线写法。脚本式流水线在序列化控制上更为灵活,有时能自然规避此类问题。

示例:

node { stage('Process JSON') { def jsonResponse = sh(script: 'curl -s http://example.com/api/data', returnStdout: true).trim() def jsonSlurper = new groovy.json.JsonSlurper() def result = jsonSlurper.parseText(jsonResponse) println(result.key) // 在脚本式块内通常可直接使用 } }
-------------------------------------- 🚀 Powered by Moshow 郑锴- 🌟 Might the holy code be with you!-------------------------------------🔍 公众号 👉 软件开发大百科💻 CSDN 👉 https://zhengkai.blog.csdn.net📂 GitHub 👉 https://github.com/moshowgame

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/28 3:33:09

如何监控fft npainting lama GPU占用?nvidia-smi使用指南

如何监控fft npainting lama GPU占用&#xff1f;nvidia-smi使用指南 1. 引言&#xff1a;为什么需要监控GPU资源&#xff1f; 你是不是也遇到过这种情况&#xff1a;启动 fft npainting lama 图像修复系统后&#xff0c;点下“开始修复”&#xff0c;结果等了半分钟还没反应…

作者头像 李华
网站建设 2026/2/27 14:02:12

Z-Image-Turbo真实感生成实战:人物肖像文生图详细教程

Z-Image-Turbo真实感生成实战&#xff1a;人物肖像文生图详细教程 1. 为什么这个模型值得你立刻上手&#xff1f; 如果你正在找一个既能跑在消费级显卡上&#xff0c;又能生成高保真人物肖像的文生图模型&#xff0c;那Z-Image-Turbo可能是目前最值得关注的选择之一。它来自阿…

作者头像 李华
网站建设 2026/2/26 13:36:34

Qwen3-1.7B实战体验:从0搭建AI对话系统

Qwen3-1.7B实战体验&#xff1a;从0搭建AI对话系统 1. 引言&#xff1a;为什么选择Qwen3-1.7B&#xff1f; 你是不是也经常在想&#xff0c;怎么才能快速搭一个属于自己的AI对话助手&#xff1f;不是那种只能回答“你好”的玩具模型&#xff0c;而是真能干活、会思考、还能扩…

作者头像 李华
网站建设 2026/2/22 13:41:24

Qwen3-Embedding-0.6B推理卡顿?显存优化部署实战案例分享

Qwen3-Embedding-0.6B推理卡顿&#xff1f;显存优化部署实战案例分享 在实际使用大模型进行文本嵌入任务时&#xff0c;很多开发者都会遇到一个共性问题&#xff1a;明明硬件资源看似充足&#xff0c;但模型推理却频繁卡顿&#xff0c;响应延迟高&#xff0c;甚至出现OOM&…

作者头像 李华
网站建设 2026/2/25 19:33:32

VibeThinker-1.5B能否替代大模型?HMMT25得分实测分析

VibeThinker-1.5B能否替代大模型&#xff1f;HMMT25得分实测分析 1. 小参数也能大作为&#xff1a;VibeThinker-1.5B的惊人表现 你有没有想过&#xff0c;一个只有15亿参数的小模型&#xff0c;真的能在推理任务上和几十亿、上百亿参数的大模型掰手腕&#xff1f;听起来像天方…

作者头像 李华
网站建设 2026/2/26 2:40:38

YOLO11保姆级教程:从环境部署到首次训练完整指南

YOLO11保姆级教程&#xff1a;从环境部署到首次训练完整指南 YOLO11是目标检测领域最新一代的高效算法&#xff0c;延续了YOLO系列“又快又准”的核心优势。相比前代版本&#xff0c;它在模型结构、特征提取能力和推理速度上进行了多项优化&#xff0c;能够在保持高精度的同时…

作者头像 李华