如何解决编译的类版本和运行时版本之间的JDK版本不匹配?

时间:2015-04-19 14:06:10

标签: java eclipse hadoop jar compilation

我正在使用eclipse(在Ubuntu 14.04LTS上)的MapReduce Java项目,我正在使用Apache Avro序列化框架,因为我需要avro-tools-1.7.7.jar文件。我从apache网站下载了这个jar,我用下载的jar编写了java代码。当我执行程序时,我收到java.lang.VerifyError错误。我从几个网站上读到这个错误是由于jar中的JDK版本的编译类文件与运行时JDK版本之间的版本不匹配。所以我从当前项目中检查了一个类的版本。

srimanth@srimanth-Inspiron-N5110:~$ javap -verbose CCHD\&CCHA/TimeForMapReduce/bin/practice/ArrayWritableX.class 
Classfile /home/srimanth/CCHD&CCHA/TimeForMapReduce/bin/practice/ArrayWritableX.class
  Last modified 19 Apr, 2015; size 1234 bytes
  MD5 checksum 9a3d03ca0f126bf7ee65d14099108984
  Compiled from "ArrayWritableX.java"
public class practice.ArrayWritableX
  SourceFile: "ArrayWritableX.java"
  minor version: 0
  major version: 51

它显示我使用的JDK版本是51.我从该jar中提取了该类文件,并检查了该类文件的版本。它显示版本为50。

srimanth@srimanth-Inspiron-N5110:~$ javap -verbose org/apache/avro/mapred/AvroCollector.class 
Classfile /home/srimanth/org/apache/avro/mapred/AvroCollector.class
  Last modified 18 Jul, 2014; size 603 bytes
  MD5 checksum d1a99c2d2ad48c8ed9d02d6b45708f70
  Compiled from "AvroCollector.java"
public abstract class org.apache.avro.mapred.AvroCollector<T extends java.lang.Object> extends org.apache.hadoop.conf.Configured
  Signature: #19                          // <T:Ljava/lang/Object;>Lorg/apache/hadoop/conf/Configured;
  SourceFile: "AvroCollector.java"
  minor version: 0
  major version: 50

我该如何解决这个问题。有没有办法在jar文件中重新编译整个类文件?或者我是否需要降级我的JDK?

其他信息:我没有使用maven

提前致谢。我很感激一些帮助。

1 个答案:

答案 0 :(得分:0)

对于自定义类和默认JDK,使用1.7,而hadoop类是使用JDK1.6编译的。

因此,更改您的JAVA_HOME变量,使其指向JDK 6工具包而不是JDK7。发布重新编译所有类并重建jar(如果有的话)。