Jackson YAML解析器与SnakeYAML兼容问题:NoSuchMethodError异常
解决Jackson YAML转换时的NoSuchMethodError异常(SnakeYAML兼容问题)
问题场景
将YAML字符串转换为自定义类时抛出如下异常:
java.lang.NoSuchMethodError: 'void org.yaml.snakeyaml.parser.ParserImpl.<init>(org.yaml.snakeyaml.reader.StreamReader, org.yaml.snakeyaml.LoaderOptions)' at com.fasterxml.jackson.dataformat.yaml.YAMLParser.<init>(YAMLParser.java:204)
执行代码:
try { MyClass claseIns = mapper.readValue(string, MyClass.class); MyClass.add(claseIns); } catch (JsonProcessingException e) { e.printStackTrace(); }
使用Spring Boot 2.7.13,Gradle配置如下:
buildscript { dependencies { classpath 'org.yaml:snakeyaml:2.0' } } dependencies { implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2' }
已确认Jackson 2.15.2标注兼容SnakeYAML 2.0,但异常仍触发。
原因分析
Spring Boot 2.7.x的依赖管理体系默认绑定的SnakeYAML版本为1.30,你在buildscript中指定的SnakeYAML 2.0仅作用于构建脚本的classpath,项目运行时的classpath依然使用Spring Boot默认的低版本SnakeYAML。而Jackson YAML 2.15.2调用了低版本SnakeYAML中不存在的ParserImpl构造方法,最终引发NoSuchMethodError。
解决方案
方案1:通过Spring Boot依赖管理统一指定版本
借助Spring Boot的dependency-management插件覆盖默认版本,确保运行时使用SnakeYAML 2.0:
plugins { id 'org.springframework.boot' version '2.7.13' id 'io.spring.dependency-management' version '1.0.15.RELEASE' // 其他项目插件 } dependencyManagement { dependencies { dependency 'org.yaml:snakeyaml:2.0' } } dependencies { implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2' // 其他项目依赖 }
方案2:直接添加implementation级别的SnakeYAML依赖
移除buildscript中的SnakeYAML配置,直接在运行时依赖中指定版本,强制覆盖默认值:
dependencies { implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2' implementation 'org.yaml:snakeyaml:2.0' // 其他项目依赖 }
方案3:验证依赖树并排除冲突
执行以下命令查看运行时依赖树,确认SnakeYAML的实际生效版本:
./gradlew dependencies --configuration runtimeClasspath | grep snakeyaml
若输出中存在1.30版本,说明有其他依赖引入了低版本SnakeYAML,通过exclude规则排除:
implementation('冲突依赖的groupId:artifactId:版本') { exclude group: 'org.yaml', module: 'snakeyaml' }
内容的提问来源于stack exchange,提问作者Liron Tal
相关产品推荐
相关产品推荐

