1. 复现错误
今天在启动项目,却报出如下错误:
Error:(3, 32) java: 无法访问org.springframework.boot.SpringApplication
错误的类文件: /C:/Users/zxy/.m2/repository/org/springframework/boot/spring-boot/3.1.0/spring-boot-3.1.0.jar!/org/springframework/boot/SpringApplication.class
类文件具有错误的版本 61.0, 应为 52.0
请删除该文件或确保该文件位于正确的类路径子目录中。
2. 分析错误
报错信息中,所说的(错误的)类文件版本指的是java class file version
。
根据上述报错信息的路径/C:/Users/zxy/.m2/repository/org/springframework/boot/spring-boot/3.1.0/spring-boot-3.1.0.jar
,找到/spring-boot-3.1.0.jar
,如下图所示:
复制spring-boot-3.1.0.jar
到桌面,同时解压该jar
包为spring-boot-3.1.0
文件夹:
打开spring-boot-3.1.0
文件夹,找到org\springframework\boot
目录,使用Windows PowerShell
进入到该目录下:
如果你还未安装Windows PowerShell
,可以点击在Windows上安装powershell教程。
我们使用javap -v SpringApplication.class
查看SpringApplication.class
的类文件版本号。
但在查看之前,需要增加Windows PowerShell
缓冲区大小。
右击Windows PowerShell
的屏幕左上角,选择属性,找到布局,选择屏幕缓冲区大小的高度,如下图所示:
默认的缓冲区大小为3000
,我设置了9000
。
因为SpringApplication.class
的类文件信息的字节数,超过了默认的缓冲区大小,无法查看完整的类文件信息。
使用javap -v SpringApplication.class
查看SpringApplication.class
的类文件版本号,如下图所示:
从图中可以看出,SpringApplication.class
类文件版本为61
,对应java
的版本是17
。
查看我的jdk
版本,如下图所示:
我的jdk
版本是8
,而我的SpringApplication
类文件需要的jdk
是17
。
因而,我的jdk
版本太低,只能降低SpringApplication
的版本,来适配我的jdk
的版本。
java
类文件版本号与jdk
版本号存在对应的关系,比如61.0
对应jdk17
, 52.0
对应jdk8
。
完整对应关系如下表格所示:
Java版本号 | java类文件版本 |
---|---|
20 | 64 |
19 | 63 |
18 | 62 |
17 | 61 |
16 | 60 |
15 | 59 |
14 | 58 |
13 | 57 |
12 | 56 |
11 | 55 |
10 | 54 |
9 | 53 |
8 | 52 |
7 | 51 |
6 | 50 |
5 | 49 |
1.4 | 48 |
1.3 | 47 |
1.2 | 46 |
1.1 | 45 |
1.0.2 | 45 |
完整对应关系可参见: The class File Format
3. 解决错误
由于我的jdk
版本是8
,无法支持所需jdk
为17
的SpringApplication
。
因而,只能降低SpringApplication
的版本,来适配我的jdk
的版本。
我们修改SpringApplication
的版本,只需要修改pom.xml
文件中的<parent>
标签下的<version>
值即可。
我原来的spring boot
的<parent>
标签下的<version>
为3.1.0
,如下代码所示:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
现将<parent>
标签下的<version>
修改为2.6.0
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
查看<parent>
标签下的<version>
为2.6.0
版本的SpringApplication.class
。
找到C:\Users\你的电脑名字\.m2\repository\org\springframework\boot\spring-boot\2.6.0
目录下的spring-boot-2.6.0.jar
包,复复制到桌面,并解压为spring-boot-2.6.0
文件夹。
在Windows PowerShell
中,使用cd C:\Users\zxy\Desktop\spring-boot-2.6.0\org\springframework\boot
命令,进入到spring-boot-2.6.0
文件夹下,执行如下命令:
而<parent>
标签下的<version>
为2.6.0
版本的SpringApplication.class
类文件版本为52
,对应jdk
的版本是8
,符合我目前安装的jdk
版本。
此时,重新启动项目,即可成功运行,如下图所示:
4. 错误总结
一般报出这个错误:无法访问org.springframework.boot.SpringApplication
,类文件具有错误的版本xxx, 应为xxx,请删除该文件或确保该文件位于正确的类路径子目录中。
原因是你的spring boot
的版本和你的jdk
版本不一致造成的,解决办法如下:
-
修改你的
jdk
版本,去适配你的spring boot
版本,这个一般不可能。 -
修改你的
spring boot
版本,适配你的jdk
版本,经常采用这种方法。