duubo 编译错误 NoClassDefFoundError,factories/SerializerFactory
说一个挺有意思的解释 dubbo 关系,dubbo 分为服务者和消费者,服务者比作司机,消费者比作乘客,zookeeper 比作滴滴 APP,双方之间的建立关系都在这个 APP 体现)
说正题了,昨天写了一个 dubbo 提供的接口报错,百思不得其解。
第一眼感觉是序列化的问题,实际已经加上了:1. 序列化的问题,缺少 Serializable(bean 实现 Serializable 接口即可)
Serialized class com.yykj.mall.dto.ProductListItemDTO must implement java.io.Serializable
报错信息如下:
Caused by: java.lang.NoClassDefFoundError: com/esotericsoftware/kryo/factories/SerializerFactory
at com.alibaba.dubbo.common.serialize.support.kryo.KryoFactory.createKryo(KryoFactory.java:74)
at com.alibaba.dubbo.common.serialize.support.kryo.PooledKryoFactory.getKryo(PooledKryoFactory.java:43)
at com.alibaba.dubbo.common.serialize.support.kryo.KryoObjectOutput.<init>(KryoObjectOutput.java:31)
at com.alibaba.dubbo.common.serialize.support.kryo.KryoSerialization.serialize(KryoSerialization.java:43)
at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.encodeRequest(ExchangeCodec.java:240)
at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec.encode(ExchangeCodec.java:76)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboCountCodec.encode(DubboCountCodec.java:39)
at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalEncoder.encode(NettyCodecAdapter.java:81)
at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.doEncode(OneToOneEncoder.java:66)
at org.jboss.netty.handler.codec.oneone.OneToOneEncoder.handleDownstream(OneToOneEncoder.java:59)
at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:591)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendDownstream(DefaultChannelPipeline.java:784)
at org.jboss.netty.channel.SimpleChannelHandler.writeRequested(SimpleChannelHandler.java:292)
at com.alibaba.dubbo.remoting.transport.netty.NettyHandler.writeRequested(NettyHandler.java:99)
at org.jboss.netty.channel.SimpleChannelHandler.handleDownstream(SimpleChannelHandler.java:254)
at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:591)
at org.jboss.netty.channel.DefaultChannelPipeline.sendDownstream(DefaultChannelPipeline.java:582)
at org.jboss.netty.channel.Channels.write(Channels.java:704)
at org.jboss.netty.channel.Channels.write(Channels.java:671)
at org.jboss.netty.channel.AbstractChannel.write(AbstractChannel.java:348)
at com.alibaba.dubbo.remoting.transport.netty.NettyChannel.send(NettyChannel.java:98)
… 52 more
Caused by: java.lang.ClassNotFoundException: com.esotericsoftware.kryo.factories.SerializerFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
… 73 more
出现问题,总是感觉都配对了,很完美,嗯嗯嗯,但是就是一直这个错,感觉是一个心病一样缠绕。。。。所以,想一想列出几项错误:1. 配置问题 2. 接口调用(使用命令)3. 使用工具验证(dubbo-admin)
1. 首先保证配置正确(好像是废话,但是我不删)2. 使用 dubbo-admin 注册服务中心,等于 zookeeper 的可视化界面,服务端和消费端接口正常情况 3. 使用 CMD 或 win10 PowerShell 操作,telnet 本地的 dubbo 端口,telnet 127.0.0.1 20880 回车
(找之前的问题截屏,太费劲就手写了)
dubbo> ls
dubbo> com.dubbo.IDubboService// 你的接口
dubbo> ls IDubboService // 查看你的方法是否存在
select // 三个方法
insert
update
dubbo> invoke select(“ 哈哈哈 ”)
[{“ 哈哈哈 ”,” 中国 ”,”xxx@qq.com”}] // 说明接口能调通,没有问题
说了这么多,总之前面的问题还没有解决,从另一方面解决,保证其他项是没有问题的(如配置,接口实现等)想了好久,SerializerFactory 感觉还是序列化出问题 1.dubbo 请求接口正常,说明配置是没有问题的,问题出现在我消费者调用服务者的时候或,我在启动消费者过程中发现这个错,表示转换有问题,不兼容,不匹配 ——-> 检查版本 – 查看 zookper 版本,dubbo 引包的版本
服务者
消费者
哦,果然是,总结:版本不兼容,确实是,替换一样的版本就好了,原因在于,项目过多,依赖好多 jar 不一定是这个版本,所以,保证双方之间版本一致性是很重要的,解决很多调用的时候,或者异常错误不明朗,高版本和低版本差异等,检查版本往往是有效果的,夜深了就说这么多了。