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

yhuiod9q  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(1032)

我正在eclipse(在ubuntu14.04lts上)中处理一个mapreducejava项目,为此我使用apacheavro序列化框架,因为我需要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
提前谢谢。谢谢你的帮助。

kkbh8khc

kkbh8khc1#

对于自定义类和默认jdk,您使用的是1.7,而hadoop类是使用jdk1.6编译的。
因此,更改javahome变量,使其指向jdk6工具包而不是jdk7。post重新编译所有类并重建jar(如果有的话)。

相关问题