错误的类文件:… 类文件具有错误的版本 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中运行。

 

欢迎拍砖!

转载于:https://www.cnblogs.com/xxyfhjl/p/6363264.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值