解决 Java 异常:“class file has wrong version”

1、概览

在处理 Java 项目时,建立新项目或更新或添加依赖时常见的错误是 “class file has wrong version(类文件版本错误)”。

本文将带你了解出现这个错误的原因以及解决办法。

2、原因

要了解根本原因,我们需要更多地了解类文件。

每当我们编译 Java 代码时,都会为编译文件中包含的每个类创建一个 .class 文件。这些 .class 文件的部分元数据是一个版本号,该版本号与用于编译代码的 Java 当前主版本号相对应。

对于最常见的 Java 版本,这些类的版本号分别为:Java 21 = 65.0、Java 17 = 61.0、Java 11 = 55.0 和 Java 8 = 51.0。如果我们使用的是不同版本的 Java,可以根据需要加减一个版本号,从而计算出相应的类文件版本号。

在运行时,Java 会查看每个 .class 文件,并要求运行环境的版本号大于或等于编译 .class 文件时使用的版本号。这种版本号要求是出于 Java 的向后兼容性机制。也就是说,如果我们运行的是 Java 17 代码,我们就可以使用任何用 Java 17 或以前版本的 Java 编译的类文件。但是,如果我们遇到一个用 Java 21 编译的 .class 文件,就会遇到 “class file has wrong version 65.0, should be 61.0”(class 文件版本号错误,应为 61.0)的错误。

3、解决办法

如上所述,“class file has wrong version” 错误是由于使用了比运行时所用版本更高的 Java 版本编译的代码造成的。

3.1、升级 Java

第一个解决方案是升级运行环境。下载并安装 Java 的升级版本。安装和升级 Java 的步骤可能因 WindowsmacOSLinux 而异。

假设遇到了 “class file has wrong version 61.0 (Java 17), should be 55.0 (Java 11)” 错误。那么,我们可以通过安装 Java 17+ 版本并更新管理 Java 编译器版本的构建属性来解决这个问题。如果使用 Maven,只需更新 pom.xml 文件即可:

<properties>
    <maven.compiler.release>17</maven.compiler.release>
</properties>

3.2、降级依赖

在某些情况下,我们可能无法选择升级 Java 环境。为此,需要找到是哪个依赖项导致了错误。

以 Spring 依赖关系为例,当前的主要发布版本是 Spring Framework 6Spring Boot 3。两者都至少需要 Java 17,但 Spring Framework 5Spring Boot 2 是用 Java 8 编译的。

这意味着,如果我们使用的是旧版本的 Java,我们可以减少对 Spring 的依赖以继续运行。不过,需要注意的是,对这些旧版本 Spring 的开源支持已经结束。

此外,当降级一个依赖项时,我们可能会遇到其他编译或运行时错误。特别是当使用库的新功能时,可能在较旧的版本中不可用。特别是,降级Spring Framework或Spring Boot可能需要大量工作。

4、总结

我们有两种方法来解决 “class file has wrong version” 错误。

降级依赖通常可以更快地解决问题。但是,可能会遇到使用没有最新安全补丁或支持的版本的情况。这还可能导致编译或运行时出错,因为库可能有重大更改,无法恢复到早期版本。

而,,升级 Java 构建和运行时环境使我们能够使用最新的依赖项,但由于业务限制,这可能不是可行的解决方案。


Ref:https://www.baeldung.com/error-class-file-has-wrong-version