一。问题情况
昨天开始搭建一个应用matini,因为有文档参考,所以搭建还是比较快的,这个应用跑在apache+jboss组成的服务器上面,基本框架是shy3+spring+oracle组成;布置环境,编译代码,一切正常后,开始启动。。。,日志文件报了一个类错误,启动失败,如下:
2012-06-08 12:26:36,582 ERROR support.RegistryDirectory - [DUBBO] Failed to refer invoker for interface:interface com.ali.caesar.platform.common.esb.DubboCustomerInfoServiceProviderInterface,url:(hessian://10.20.143.205:27777/com.ali.caesar.platform.common.esb.DubboCustomerInfoServiceProviderInterface?anyhost=true&application=martini&check=false&dubbo=2.1.4&interface=com.ali.caesar.platform.common.esb.DubboCustomerInfoServiceProviderInterface&methods=queryMultiMemberInfoList,findBatchLatestCustomerInfo&pid=19199&revision=3.1.25&server=jetty×tamp=1339122204533&version=1.0.0)com.caucho.hessian.client.HessianProxy.<init>(Ljava/net/URL;Lcom/caucho/hessian/client/HessianProxyFactory;)V, dubbo version: 2.0.12, current host: 10.16.46.65
java.lang.NoSuchMethodError: com.caucho.hessian.client.HessianProxy.<init>(Ljava/net/URL;Lcom/caucho/hessian/client/HessianProxyFactory;)V
二。处理过程
看了下,应该是说初始化类过程中,有个类的方法没有找到;DubboCustomerInfoServiceProviderInterface这个类是DUBBO反射实例化的。
是不是dubbo类的提供方的方法有问题?查询了dubbo注册平台,类提供方正常,版本号也正常,而且出错不是提示没有调用方,那么应该是调用后初始化失败;
然后在eclipse里面使用类检索功能,查询出错的com.caucho.hessian.client.HessianProxy类,发现有两个不同的jar里面存在同名类;比较了下,其中一个类有两个初始化方法如下:
/**
* Package protected constructor for factory
*/
HessianProxy(HessianProxyFactory factory, URL url)
{
_factory = factory;
_url = url;
}
/**
* Protected constructor for subclassing
*/
protected HessianProxy(URL url, HessianProxyFactory factory)
{
_factory = factory;
_url = url;
}
而另一个只有第一个方法,再比照出错的提示没有找到的方法,基本可以确认就是由于同名不同类载入的问题,导致出错。
找到原因后,就把war包lib里面打包的类jar删除,重新启动jboss,可以看到出错消失了,应用启动成功~!
三。后续问题
我拉的martini是主干,清空二方库后重新打得包,拥有同名文件的jar包生成日期是一致的,换句话说,martini应用主干本身依赖关系里面就存在这种风险,怎么之前没有暴露出这个问题,线上环境也没有这种同名不同类载入的问题呢?我需要再跟进调查下。