项目一启动就抛 UnsupportedClassVersionError,提示 class file version 61.0,可这台服务器上装的明明是 JDK 8。
这种时候先查看 JDK 版本,确认机器上到底跑的是哪个。最常用的就是这两条命令:
java -version
javac -version前者是运行时,后者是编译器。java 输出 1.8.0_381,说明是 JDK 8,1.8 就是 8;输出 17.0.9,就是 JDK 17。没有 1.17 这种写法。注意这两条命令的输出走的是标准错误流,脚本里重定向要写 2>&1 才能抓到。
两条命令版本对不上
很常见。多半是 PATH 里排在前面的 java 属于另一个 JDK,而 JAVA_HOME 指向的又是第三个版本。Windows 上用 where java,Linux 上用 which java,再看 readlink -f 的结果,把真实路径找出来。
有的机器装过 Oracle JDK,又在环境变量里塞了 OpenJDK,两个目录都进 PATH,谁在前面谁生效。把不需要的那个从 PATH 里挪走,再重开一个终端。
一次看全所有参数
java -XshowSettings:properties -version输出里有 java.home、java.version、java.class.version 几个关键项。Windows 下可以接 | findstr java 过滤。class 版本号 52 对应 8,61 对应 17,65 对应 21,报错里的数字就是它。
IDE 里也要看一遍。IDEA 的 Project Structure 里分别设了 SDK、Language level 和编译输出,三处不一致时,命令行编得过,IDE 里照样报错。
项目到底要哪个版本
Spring Boot 3 起步要求 JDK 17,很多老项目锁死 8。编译目标写在 pom.xml 的 source 和 target 里,或者 build.gradle 的 toolchain 配置里,以它为准。mvn -v 也能看到 Maven 实际使用的 Java 版本。
判断办法:javac 版本决定能编出什么 class,java 版本决定能不能跑。两边对齐到同一个大版本,再谈别的报错。