You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring 3.x升级至5.x后出现java.lang.NoClassDefFoundError问题求助

Spring 5.x升级后Jackson类找不到问题分析与解决

1. 确实存在依赖冲突,根源是Spring版本升级带来的Jackson依赖变更

Spring 3.x和5.x对Jackson的依赖逻辑完全不同,直接导致了原本共存的两个Jackson版本出现兼容问题。

2. 为什么Spring 3.x下能正常运行?

Spring 3.x原生依赖的是org.codehaus.jackson(Jackson 1.x分支),这个分支和你项目里引入的com.fasterxml.jackson(Jackson 2.x分支)是完全独立的两个包——包名不一样,类加载器能明确区分两者的类,不会互相干扰。当时你的项目里应该是部分模块用1.x、部分用2.x,Spring 3.x本身不会主动加载2.x的类,所以两边能和平共处。

3. 报错指向com.fasterxml而非codehaus的原因

Spring 5.x已经彻底抛弃了Jackson 1.x的支持,内部所有涉及JSON处理的组件(MVC、数据绑定等)默认依赖Jackson 2.x的com.fasterxml系列类。升级后,Spring核心模块会主动尝试加载com.fasterxml.jackson.databind.ObjectMapper,但你的项目可能出现了以下情况:

  • 虽然你引入了Jackson 2.11.0,但依赖传递中这个包被其他依赖意外排除;
  • 存在其他依赖引入了更低版本的Jackson 2.x,导致类版本不兼容(NoClassDefFoundError不一定是找不到类,也可能是找到类但加载时因为依赖缺失、版本不匹配失败);
  • Eclipselink如果配置了Jackson序列化扩展,升级Spring后它也会尝试调用Jackson 2.x的API,进一步触发这个错误。

4. 具体解决步骤

  • 统一Jackson版本:删掉所有org.codehaus.jackson相关依赖,全项目改用com.fasterxml.jackson(建议选Spring 5.x兼容的版本,比如2.12.x及以上,Spring 5.3.x官方推荐Jackson 2.12+)。
  • 排查依赖树:用Maven命令mvn dependency:tree或Gradle命令./gradlew dependencies查看依赖关系,找出引入冲突Jackson版本的依赖,用<exclusions>(Maven)或exclude(Gradle)排除掉。
  • 替换代码中的引用:把项目里所有org.codehaus.jackson.map.ObjectMapper的引用换成com.fasterxml.jackson.databind.ObjectMapper,同时调整相关注解、序列化逻辑(比如Jackson 1.x的@JsonSerialize和2.x的包路径不同)。
  • 适配Eclipselink:如果Eclipselink需要Jackson支持,确保使用适配Jackson 2.x的包(比如eclipselink-jackson),且版本和你用的Jackson 2.x匹配。

内容的提问来源于stack exchange,提问作者Arun Rajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:15:55