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

Gradle 2.8同代码main正常JUnit测试报NoSuchMethodError排查

问题根因

这个报错和Jackson包版本无关,核心原因是SnakeYAML传递依赖版本不匹配:

  • jackson-dataformat-yaml:2.12.1 依赖SnakeYAML 1.27及以上版本,只有1.27+版本的ScalarEvent构造方法才包含DumperOptions$ScalarStyle类型的入参,低版本(≤1.26)没有这个方法签名,才会触发NoSuchMethodError。
  • 你的配置里只强制了Jackson相关包的版本,没有对SnakeYAML做版本约束。main源码集运行正常,是因为main类路径下传递拉取的SnakeYAML版本刚好符合要求;但test类路径会额外加载JUnit、其他测试工具依赖,其中部分依赖(比如老版本Spring Test、部分嵌入式组件测试包)会传递引入低版本SnakeYAML,覆盖掉你需要的高版本,最终触发报错。
  • 你之前的排查方向有偏差:报错缺失的方法属于SnakeYAML包,不属于Jackson,所以你只核对Jackson版本自然定位不到问题。
调试定位方法

按以下两步可以100%确认问题:

  • 执行依赖树查看命令,搜索SnakeYAML的引入来源:
gradle dependencies --configuration testRuntime | grep snakeyaml

输出里会明确显示是哪个依赖传递引入了低版本SnakeYAML。

  • 如果依赖树显示版本正常,可以在测试代码里加一行打印,直接确认运行时实际加载的SnakeYAML包路径:
System.out.println(org.yaml.snakeyaml.Yaml.class.getProtectionDomain().getCodeSource().getLocation());

执行测试后控制台会直接打印当前加载的snakeyaml jar的本地路径,从路径名就能直接看到实际使用的版本。

修复方案

直接在现有版本强制规则里补充SnakeYAML的版本约束即可,修改后的配置片段如下:

configurations {
    compile.extendsFrom swagConfig
    runtime.extendsFrom swagRuntime
    runtime {
        resolutionStrategy {
            force 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-databind:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-core:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-annotations:2.12.1'
            // 新增:强制SnakeYAML版本匹配Jackson要求
            force 'org.yaml:snakeyaml:1.28'
        }
    }
    testRuntime {
        resolutionStrategy {
            force 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-databind:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-core:2.12.1'
            force 'com.fasterxml.jackson.core:jackson-annotations:2.12.1'
            // 新增:测试类路径同样强制SnakeYAML版本
            force 'org.yaml:snakeyaml:1.28'
        }
    }
}

如果不想用resolutionStrategy强制版本,也可以直接把org.yaml:snakeyaml:1.28加到swagRuntime依赖列表中,效果一致。

注:如果加了版本强制还是报错,检查是否有测试依赖把SnakeYAML直接shade进了自身jar包(这种情况极少),如果有,对该依赖配置exclude排除snakeyaml即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:03:42