Bug:SpringBoot类文件具有错误的版本 61.0, 应为 52.0

Posted NPE~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bug:SpringBoot类文件具有错误的版本 61.0, 应为 52.0相关的知识,希望对你有一定的参考价值。

Bug:SpringBoot类文件具有错误的版本 61.0, 应为 52.0

启动Springboot项目时候报错
java: 无法访问org.springframework.boot.SpringApplication
错误的类文件: /D:/Maven/apache-maven-3.6.3/repository/org/springframework/boot/spring-boot/3.0.0/spring-boot-3.0.0.jar!/org/springframework/boot/SpringApplication.class
类文件具有错误的版本 61.0, 应为 52.0
请删除该文件或确保该文件位于正确的类路径子目录中。

1 错误复现

从网上下载了一个项目之后,准备测试直接启动,下载完maven依赖之后,启动SpringBoot报错

....类文件具有错误的版本 61.0, 应为 52.0

2 解决方法

2.1 升级本地jdk为jdk17以上

将本地和idea项目的jdk版本改用为jdk17
  • 修改本地jdk为17

  • 修改idea的编译:

  • 修改项目的jdk

  • ”你发任你发 我用Java8“的时代可能要改变了,jdk17无论从GC,或者特性等各方面都超过了Java8,且加上JDK17是一个 Oracle官宣可以免费商用的LTS版本,所谓 LTS,是 Long Term Support,也就是官方保证会长期支持的版本。
  • JDK 17 将是继 Java 8 以来最重要的LTS版本,是 Java 社区八年努力的成果。
    不过,据说JDK21更值得令人期待。

2.2 降低SpringBoot的starter依赖版本

SpringBoot使用了3.0或者3.0以上,因为Spring官方发布从Spring6以及SprinBoot3.0开始最低支持JDK17,所以仅需将SpringBoot版本降低为3.0以下即可。

查看了一下我项目的maven依赖,发现确实是3.0.0版本,因此只需要降低版本即可

 <parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.7.5</version>
     <relativePath/> <!-- lookup parent from repository -->
 </parent>

3 后续bug

我将本地jdk换为17之后,报如下错误:

  1. Java HotSpot™ 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
    错误: 找不到或无法加载主类 io.github.xxyopen.novel.NovelApplication
    原因: java.lang.ClassNotFoundException: io.github.xxyopen.novel.NovelApplication

解决办法:

选中自己的SpringBoot项目,点击Modify options:

勾选上Disable launch optimization:

2. 错误: 找不到或无法加载主类 io.github.xxyopen.novel.NovelApplication
原因: java.lang.ClassNotFoundException: io.github.xxyopen.novel.NovelApplication

解决办法:

清除缓存

  • file—>Project Structure
  • 点击Project Settings中的Moudles—>点击减号将所有的Moudle删除
  • 点击+号重新引入Moudle
  • 找到项目的父文件夹—>OK
  • Rebuild Project
  1. 如果依然报找不到主类,则设置运行参数范围

之前运行项目报错:Command line is too long. Shorten command line

参考文章:
https://blog.csdn.net/qq_49619863/article/details/128047256
https://codeantenna.com/a/kYrzHtE8Id

错误的类文件:… 类文件具有错误的版本 52.0,应为 50.0

出现问题:

今天在pom.xml中引入了最新版本guava工具包,编译时报了如下错误:

[ERROR] E:\\workspace\\report\\src\\main\\java\\indi\\johnny\\report\\template\\excel\\ExcelXSSFStyle.java:[16,-1] 无法访问 com.google.common.base.Strings
错误的类文件: com\\google\\common\\base\\Strings.class(com\\google\\common\\base:Strings.class)
类文件具有错误的版本 52.0,应为 50.0

如图:

image

图1

概念引进:

      major.minor 版本号:每个版本的 JDK 编译器编译出的 class 文件中都带有一个版本号。

      上面截图中出现的52.0 50.0 就是我们所说的major版本号。

 

问题排查:

将出现问题的guava-21.0.jar 通过[ jar –xvf  guava-21.0.jar ]解压后,进入目录,找到报出异常的类"Strings"

image

图2

通过找到报出异常的类"Strings" ,使用 命令:[  javap -verbose Strings ]  ,能显示出类的 major.minor 版本,major版本确实为52。

image

图3

解决方案:

降低guava的版本,如下图所示,将版本21.0换成19.0:

image

图4

再次编译项目,则编译成功。

解压 guava-19.0.jar后,找到报出异常的类"Strings" ,使用 命令:[  javap -verbose Strings ]  ,能显示出类的 major.minor 版本,为50。

image

图5

jdk版本与major版本对应的关系如下,参考博客:http://smilejay.com/2014/02/java-unsupported-major-minor-version-51-0/

image

图6

我本地的jdk版本为1.6(等同6.0),对应的major版本为50,所以异常提示的信息为 "应为 50.0"

查看guava-21.0.jar解压后目录META-INF下的文件MANIFEST.MF,如图所示,jdk编译版本为1.8:

image

图7

但是查看guava-19.0.jar解压后目录META-INF下的文件MANIFEST.MF,如图所示,jdk编译版本不是1.6,而是1.7:

image

图8

个人理解:class文件加载至jvm并不是完全按照图6一 一对应的关系,而是按照major.minor版本号范围来加载至JVM,超出范围则要出错。

本地1.6的环境能够识别并运行1.7编译的guava-19.0.jar包,是因为guava-19.0.jar中的"Strings"类的major版本号为50。

参考博客:http://sheng.iteye.com/blog/690035

 

结论:加载至jvm中的class文件,class文件的major版本号必须等于或小于当前jvm环境要求的最大major版本号。

通俗讲:假设Student.class的major版本号为50,既可以放在1.6的jvm中运行,也可以放在1.8的jvm中运行。若Student.class的major版本号为52,则只能在1.8或更高版本的jvm中运行。

 

欢迎拍砖!

以上是关于Bug:SpringBoot类文件具有错误的版本 61.0, 应为 52.0的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅解决错误:类文件具有错误的版本 55.0, 应为 52.0

java: 无法访问org.springframework.boot.SpringApplication ,错误的类文件:XXX,类文件具有错误的版本 61.0, 应为 52.0

仅具有静态方法的模板类使用 .cpp 文件实现给出错误

记录一些遇见的bug——springBoot+minio文件上传为txt文件时,如果上传时编码格式不是utf-8,就会出现通过文件链接直接在windows窗口预览文件,文件内容乱码问题

记录一些遇见的bug——springBoot+minio文件上传为txt文件时,如果上传时编码格式不是utf-8,就会出现通过文件链接直接在windows窗口预览文件,文件内容乱码问题

如何在 mvc 中创建具有多版本支持的解决方案