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

如图:

图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中运行。

欢迎拍砖!

时间: 2024-10-13 05:34:57

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

用 Qt 中的 QDomDocument类 处理 XML 文件(上)

我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取. 根据常用的操作,我简单的把对XML的操作分为以下几类: 1 首先对XML文件进行操作,打开文件. 这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成. TopoDataReader::TopoDataReader(const wstring &filePath):_filePath(filePath),_

[工具类]文件或文件夹xx已存在,则重命名为xx(n)(2)

写在前面 最近一直在弄文件传输组件,其中一个功能就是,在接收端接收文件时,如果文件已经存在了,则对其进行文件名+索引的方式进行自动重命名,之前也写个类似的工具类,总感觉代码太冗余,每回头想想,总觉得心里有疙瘩,下班的时候在地铁上,又想了想,感觉是我把问题想复杂了,遂将今天的思路整理一下,写了一个辅助类,记录在此. 上篇文章 [工具类]文件或文件夹xx已存在,则重命名为xx(n) ReNameHelper代码 1 using System; 2 using System.Collections.G

PHP加载另一个文件类的方法

加载另一个文件类的方法 当前文件下有a.php 和b.php,想要在class b中引入class a <?php    class a    {        public $name = 'zhouqi';        public function say()        {            echo 'hello '.$this->name;        }    } <?php    class b    {        //require('a.php'); 错

第一章 文件类基础命令

本文目录: 1.1 关于路径 1.2 查看目录内容 1.3 文件的时间戳(atime/ctime/mtime) 1.4 文件/目录的创建和删除 1.5 查看文件类型file命令 1.6 文件/目录复制和移动 1.7 查看文件内容 1.8 文件查找类命令 1.1 关于路径 Linux中分绝对路径和相对路径,绝对路径一定是从/开始写的,相对路径不从根开始写,还可能使用路径符号. 路径展开符号: .           :(一个点)表示当前目录 ..          :(两个点)表示上一层目录 - 

Linux下读取Ini文件类

Linux下读取Ini文件类 最近项目上有需要读取Ini文件 所谓Ini文件也就是文本文档 并且以 //注释1 /*注释2 [Section] Key1=aaa Key2=bbb 这种形式存在的文档 自己编写了一个类  比较使用 简单 可以跨平台读写INI文件 头文件Ini.h #include <map> #include <string> using namespace std; #define CONFIGLEN 256 enum INI_RES { INI_SUCCESS,

文件上传类,实现文件上传功能

/** *==================================================================  * upload.class.php 文件上传类,实现文件上传功能 * 2013年3月27日0:37:15 *================================================================== */ class Upload{    private $path;   //文件上传目录    privat

C# 通用上传文件类

1.Upfile.aspx: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Upfile.aspx.cs" Inherits="Inc_Upfile" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.or

PHP 上传文件类

<?php /** * * @name upload.class.php * 上传文件类 * @author Peter * @createtime 2014-11-20 10:30:29 * */ class upload{ public $max_size; //上传file大小 public $allow_types; //上传文件类型 public $file_name; //文件名 public $errmsg; //错误提示 public $uploaded; //后的文件名 pub

javah 生成.h文件时出现的错误

javah 時出現错误: 无法访问android.app.Activity,找不到android.app.Activity的类文件   "Run TestJni1" 或 "Debug TestJni1" 后,"D:\workspace\testjni1\bin\classes\com\example\testjni1" 目錄下會產生很多 *.class 文件,對其中的 "MainActivity.class" 進行如下操作,據