先把当时的情况摆出来。Spring Boot 2.7 项目引入 openai-java 0.20.0,编译通过,运行时抛 NoSuchMethodError,指向 okhttp3.RequestBody.create 的重载,项目里原来的 okhttp 版本是 3.14。
把日志和配置对完,能解释这个现象的基本就这几处。openai-java 0.20 依赖 okhttp 4.x。少数情况下是Spring Boot 的依赖管理把 okhttp 钉在 3.x。
还有一种情况,本地仓库里还有旧版 jar 被优先加载。另外,打包时把两个版本的 okhttp 一起塞进 fat jar。
上来先打依赖树看 okhttp 的实际版本
mvn dependency:tree -Dincludes=com.squareup.okhttp3
随后查冲突来源并排除旧版本
mvn dependency:tree -Dverbose | grep okhttp
显式拉取 okhttp 4.12 覆盖旧值
mvn -q dependency:get -Dartifact=com.squareup.okhttp3:okhttp:4.12.0
等前面都确认过,再重新打包后确认只有一个版本
mvn -q package -DskipTests; jar tf target/app.jar | grep okhttp
这台环境是别人交接的,不少默认值被动过,只能一项项核。
同事提醒我看一下最近一次发布,时间点确实对得上。
恢复的判定其实很直接。启动不再抛 NoSuchMethodError,调用接口返回 200,fat jar 里 okhttp 只有一个版本目录。
容易忽略的是,这类错误编译期看不出来,依赖调解只管声明不管运行时类路径顺序,得看打包结果。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
