java.lang.IncompatibleClassChangeError 错误分析

    最近帮助同事把之前给他搭建的Hadoop2.2集群升级到2.4,并将之前我们做的实时应用程序迁移部署到Hadoop2.4上。

       在迁移的过程中,他发现之前通过Scribe客户端向Scribe中继发送日志的程序总是报错,异常日志是:

java.lang.IncompatibleClassChangeError: com/sina/mis/calligraphus/thrift/CalligraphusService$Client
	at com.sina.mis.client.ClientMulti.connect(ClientMulti.java:176)
	at com.sina.mis.client.ClientMulti.access$100(ClientMulti.java:37)
	at com.sina.mis.client.ClientMulti$1.run(ClientMulti.java:156)
	at java.util.TimerThread.mainLoop(Timer.java:512)
	at java.util.TimerThread.run(Timer.java:462)

      看一场应该是接口或者类的实现改变,导致的IncopatibleClassChangeError。 仔细检查了一下出错的代码为  inco1       分析一下Client一直是个抽象类,没有问题,Iface一直是接口也没有问题,出问题的就在TServiceClient接口上,联想到之前也是遇到过这个问题,Thrift在0.7以后这个接口就变成了抽象类,导致了implements报错,仔细的查看了一下集群上面使用这个累的jar包,确定是hive-exec.jar,反编译以后得到了印证:

col1

      最后解决方法,目前想到的是修改程序,明天查看一下是否可以通过选项将用户提交的jar包覆盖父类继承的CLASSPATH。

Print Friendly

jiang yu

Leave a Reply