一、异常描述
[ERROR] /Users/****/src/main/java/com/wn/mockito/controller/AccountController.java:[5,52] 无法访问org.springframework.beans.factory.annotation.Autowired
错误的类文件: /Users/***/repository/org/springframework/spring-beans/6.1.10/spring-beans-6.1.10.jar(org/springframework/beans/factory/annotation/Autowired.class)
类文件具有错误的版本 61.0, 应为 52.0
请删除该文件或确保该文件位于正确的类路径子目录中。
无法访问org.springframework.stereotype.Controller
二、问题分析
用户遇到的问题是类文件版本不兼容。具体错误信息指出类文件版本为 61.0,而应为 52.0。
三、可能原因
- JDK 版本不匹配:项目使用的 JDK 版本与 Spring 依赖的版本不兼容。
- 依赖版本冲突:项目中引入了不兼容的 Spring 版本。
四、解决方案
1.检查 JDK 版本:
Java 的 JDK 版本与类文件的 major version 对应关系如下:
JDK 版本 | Major Version |
---|---|
JDK 1.0 | 45 |
JDK 1.1 | 45 |
JDK 1.2 | 46 |
JDK 1.3 | 47 |
JDK 1.4 | 48 |
JDK 5.0 | 49 |
JDK 6 | 50 |
JDK 7 | 51 |
JDK 8 | 52 |
JDK 9 | 53 |
JDK 10 | 54 |
JDK 11 | 55 |
JDK 12 | 56 |
JDK 13 | 57 |
JDK 14 | 58 |
JDK 15 | 59 |
JDK 16 | 60 |
JDK 17 | 61 |
JDK 18 | 62 |
JDK 19 | 63 |
JDK 20 | 64 |
JDK 21 | 65 |
例如我的项目使用的是 JDK 8
wn@wndeMBP ~ % Java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
确保项目使用的 JDK 版本与 Spring 依赖的版本兼容。
- JDK 8 对应版本 52.0
- JDK 17 对应版本 61.0
如果项目使用的是 JDK 8,但引入了 JDK 17 对应的 Spring 版本,会导致版本不兼容。
详细说明
- Major Version 是 Java 类文件格式的一部分,用于标识类文件的版本。
- 每个 JDK 版本都会生成特定 major version 的类文件。
- 如果一个类文件的 major version 与当前运行的 JDK 版本不匹配,会导致类文件加载失败。
确保你的项目使用的 JDK 版本与生成的类文件的 major version 匹配。
2.调整 Spring Boot 版本
Spring Boot 与 JDK 版本的对应关系如下:
Spring Boot 版本 | 支持的 JDK 版本 |
---|---|
Spring Boot | JDK 17 及以上 |
Spring Boot | JDK 8 及以上 |
Spring Boot | JDK 6 及以上 |
详细说明
-
Spring Boot :
- 最低支持 JDK 17。
- 推荐使用 JDK 17 或更高版本,如 JDK 18、JDK 19 等。
- 充分利用 JDK 17 的新特性,如密封类(Sealed Classes)、模式匹配(Pattern Matching)等。
-
Spring Boot :
- 最低支持 JDK 8。
- 推荐使用 JDK 8 或更高版本,如 JDK 11、JDK 17 等。
- 充分利用 JDK 8 的新特性,如 Lambda 表达式、Stream API 等。
-
Spring Boot :
- 最低支持 JDK 6。
- 推荐使用 JDK 8。
- 对 JDK 8 的支持有限。
示例
如果你使用的是 JDK 8,推荐使用 Spring Boot :
<parent>
<groupId></groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version>
</parent>
如果你使用的是 JDK 17,推荐使用 Spring Boot :
<parent>
<groupId></groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
</parent>
确保你的项目使用的 JDK 版本与引入的 Spring Boot 版本兼容。
3.调整 Spring 版本:
确保引入的 Spring 版本与项目使用的 JDK 版本兼容。
Spring 框架与 JDK 版本的对应关系如下:
Spring 版本 | 支持的 JDK 版本 |
---|---|
Spring | JDK 17 及以上 |
Spring | JDK 8 及以上 |
Spring | JDK 6 及以上 |
Spring | JDK 5 及以上 |
详细说明
-
Spring :
- 最低支持 JDK 17。
- 推荐使用 JDK 17 或更高版本,如 JDK 18、JDK 19 等。
- 充分利用 JDK 17 的新特性,如密封类(Sealed Classes)、模式匹配(Pattern Matching)等。
-
Spring :
- 最低支持 JDK 8。
- 推荐使用 JDK 8 或更高版本,如 JDK 11、JDK 17 等。
- 充分利用 JDK 8 的新特性,如 Lambda 表达式、Stream API 等。
-
Spring :
- 最低支持 JDK 6。
- 推荐使用 JDK 8。
- 对 JDK 8 的新特性有部分支持,但可能需要额外配置。
-
Spring :
- 最低支持 JDK 5。
- 推荐使用 JDK 6 或 JDK 7。
- 对 JDK 8 的支持有限。
<!-- 我原来引用,这个支持jdk17 -->
<dependency>
<groupId></groupId>
<artifactId>spring-context</artifactId>
<version>6.1.10</version>
</dependency>
<!-- 修改后引用,这个支持jdk8 ,问题解决-->
<dependency>
<groupId></groupId>
<artifactId>spring-context</artifactId>
<version>5.3.19</version>
</dependency>
五、总结
确保项目使用的 JDK 版本与引入的 Spring、Spring Boot 版本兼容