错误的类文件:… 类文件具有错误的版本 52.0,应为 50.0
2017-02-03 18:53
387 查看
出现问题:
今天在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
如图:
图1
概念引进:
major.minor 版本号:每个版本的 JDK 编译器编译出的 class 文件中都带有一个版本号。
上面截图中出现的52.0 50.0 就是我们所说的major版本号。
问题排查:
将出现问题的guava-21.0.jar 通过[ jar –xvf guava-21.0.jar ]解压后,进入目录,找到报出异常的类"Strings"
图2
通过找到报出异常的类"Strings" ,使用 命令:[ javap -verbose Strings ] ,能显示出类的 major.minor 版本,major版本确实为52。
图3
解决方案:
降低guava的版本,如下图所示,将版本21.0换成19.0:
图4
再次编译项目,则编译成功。
解压 guava-19.0.jar后,找到报出异常的类"Strings" ,使用 命令:[ javap -verbose Strings ] ,能显示出类的 major.minor 版本,为50。
图5
jdk版本与major版本对应的关系如下,参考博客:http://smilejay.com/2014/02/java-unsupported-major-minor-version-51-0/
图6
我本地的jdk版本为1.6(等同6.0),对应的major版本为50,所以异常提示的信息为 "应为 50.0"
查看guava-21.0.jar解压后目录META-INF下的文件MANIFEST.MF,如图所示,jdk编译版本为1.8:
图7
但是查看guava-19.0.jar解压后目录META-INF下的文件MANIFEST.MF,如图所示,jdk编译版本不是1.6,而是1.7:
图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中运行。
欢迎拍砖!
今天在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
如图:
图1
概念引进:
major.minor 版本号:每个版本的 JDK 编译器编译出的 class 文件中都带有一个版本号。
上面截图中出现的52.0 50.0 就是我们所说的major版本号。
问题排查:
将出现问题的guava-21.0.jar 通过[ jar –xvf guava-21.0.jar ]解压后,进入目录,找到报出异常的类"Strings"
图2
通过找到报出异常的类"Strings" ,使用 命令:[ javap -verbose Strings ] ,能显示出类的 major.minor 版本,major版本确实为52。
图3
解决方案:
降低guava的版本,如下图所示,将版本21.0换成19.0:
图4
再次编译项目,则编译成功。
解压 guava-19.0.jar后,找到报出异常的类"Strings" ,使用 命令:[ javap -verbose Strings ] ,能显示出类的 major.minor 版本,为50。
图5
jdk版本与major版本对应的关系如下,参考博客:http://smilejay.com/2014/02/java-unsupported-major-minor-version-51-0/
图6
我本地的jdk版本为1.6(等同6.0),对应的major版本为50,所以异常提示的信息为 "应为 50.0"
查看guava-21.0.jar解压后目录META-INF下的文件MANIFEST.MF,如图所示,jdk编译版本为1.8:
图7
但是查看guava-19.0.jar解压后目录META-INF下的文件MANIFEST.MF,如图所示,jdk编译版本不是1.6,而是1.7:
图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中运行。
欢迎拍砖!
相关文章推荐
- 解决问题【***.class类文件具有错误的版本52.0,应为50.0*****】,知识点整理
- 类文件具有错误的版本 50.0 应为49.0
- 错误:"类文件具有错误的版本 50.0,应为 49.0"的解决
- 类文件具有错误的版本 50.0,应为 49.0
- 类文件具有错误的版本 50.0,应为 49.0 解决二三事
- 工程运行环境变更时报错“类文件具有错误的版本 50.0,应为 49.0”
- Android 生成 c/c++ 头文件 错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件
- javah 生成.h文件时,出现的“错误:找不到 ‘’类文件的错误”
- 错误:为具有端口 "50000" 的服务名称 "db2c_DB2" 而更新系统上的服务文件时出错。
- 无法升级数据库 'SchoolPlatForm1',因为它是只读的,或者具有只读文件。请将数据库或文件设为可写,然后重新运行恢复操作。 (Microsoft SQL Server,错误: 3415)
- 升级CUDA版本导致VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上存在该文件
- VS2005 编译Release版本出现清单文件的错误
- VS2005 编译Release版本出现清单文件的错误
- 新编译版本读配置文件错误问题定位
- 命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法
- 升级CUDA版本导致VS2010错误:未找到导入的项目XXX,请确认<Import>声明中的路径正确,且磁盘上存在该文件。。。。
- GetFileVersionInfo 获取文件版本信息错误原因分析
- 错误:为具有端口 "50000" 的服务名称 "db2c_DB2" 而更新系统上的服务文件时出错。
- 错误提示之:SQL—无法在服务器上访问指定的路径或文件。请确保您具有必需的安全权限且该路径或文件存在。
- server version for the right syntax to use near 'USING BTREE 数据库文件版本不合导致的错误