应用启动直接抛 Unsupported class file major version 61,堆栈指向某个 jar。这不是依赖坏了,而是编译用的 JDK 版本比运行环境高,字节码不兼容。

数字对应哪个版本

61 对应 Java 17,55 是 Java 11,52 是 Java 8。看到 61 就说明这个类是用 JDK 17 编译的,而你现在跑在 11 或 8 上。

先核对两端版本

java -version
javac -version
mvn -v | head -n 3

三条输出里的版本不一致,问题就清楚了。常见于本地用新 JDK 打包,服务器或容器镜像是旧版本。

统一版本或降编译目标

在 pom.xml 里显式指定编译目标,让产物能在低版本 JDK 上运行:


    11

用了 release 参数后,编译期就会拦住高版本 API 的调用,比事后运行时报错好排查。升级运行环境则要同步检查依赖,部分框架的新版本对 JDK 有硬性要求。

容器部署时把基础镜像的 JDK 版本写进 Dockerfile,别用 latest 标签,镜像一变就可能出现同样的报错。

确认是不是依赖内部传来的类

unzip -p 某个.jar 类路径.class | head -c 8 | xxd

读出前八个字节里的版本号,也能反推是哪个依赖用了高版本编译。第三方 SDK 遇到过这种情况,升级依赖通常比改运行时更省事。

本地能跑、服务器报错,九成是两端 JDK 不同,先把版本对齐再谈其他可能。

作者 9823189