升级Jersey至2.40后触发ClassNotFoundException的根因咨询
问题根本原因解析
1. Jackson Databind的API不兼容变更
com.fasterxml.jackson.databind.AnnotationIntrospector$XmlExtensions这个内部类仅存在于Jackson Databind的旧版本(如2.10.x及更早)中。Jersey 2.40依赖的是较新版本的Jackson Databind(通常为2.15.x及以上),该版本已经移除或重构了这个类,不再保留原类的定义。
2. Maven依赖调解触发了不兼容的版本组合
- 你的主项目同时引入了Jersey 2.40(附带新版Jackson)和旧版本的logstash-logback-encoder(依赖旧版Jackson)。
- 按照Maven的依赖调解规则(路径最短优先,路径相同时以POM中声明顺序为准),最终类路径中生效的是Jersey引入的新版Jackson。
- 项目启动时,旧版logstash-logback-encoder的初始化代码会尝试加载
XmlExtensions类,但此时类路径里的新版Jackson已无此类,直接抛出ClassNotFoundException。
3. 小型项目未出问题的原因
小型项目依赖关系简单:要么没引入logstash-logback-encoder,要么使用的logstash版本刚好适配Jersey 2.40的Jackson版本,因此没有触发版本冲突导致的类缺失。
4. 更新logstash版本解决问题的逻辑
新版logstash-logback-encoder已经适配了Jackson的新版本,其代码不再依赖已被移除的XmlExtensions类,转而使用Jackson新版中对应的替代实现,因此启动时不会再出现类找不到的错误。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

