日前项目将日志软件由Log4j升级到Log4j2,项目使用了dubbo做分布式服务,因此需要使用zkclient连接到Zookeeper集群。
使用Idea的依赖树图,将已有jar包中包含Log4j的,全部选择除去,然后引入Log4j2,slf4j。日志输出格式为Json,因此还需要引入jackson-core和jacksson-databind。修改完之后,将几个子项目一一发布。结果有三个服务报错,错误为
Caused by: java.lang.ClassNotFoundException: org.apache.zookeeper.Watcher$Event$KeeperState
顾名思义,这是表示org.apache.zookeeper.Watcher$Event$KeeperState这个类没找到。但仔细查证,发布的项目中是包含Zookeeper的jar包的。那为什么找不到呢?网上有篇文章说,是消费端启动的时候,服务端没处在服务状态,多次重连之后抛出异常,造成这个错误。这个观点结合我的情况来看,并不适用,报错的子项目所依赖的服务,都很稳定正常地在运行,不存在这种原因。

后来想起来,其他正常运行的子项目和这几个项目有什么区别呢?一比较Zookeeper和Zkclient的部分,果然,exclusions部分不一样,不正常的子项目的zkClient没有这一部分,正常的包含这一部分。于是按照正常的子项目的pom.xml文件进行修改,去除了有关Log4j的依赖,再次发布,项目正常启动了。

综合分析,是因为依赖关系出错,造成zkClient不能正常初始化,因此在调用远程的dubbo服务时,就不能正常连到Zookeeper集群,在程序看来,就类似于消费端启动的时候,服务端没处在服务状态,多次重连之后抛出异常的情况。因此会有这个错误。

作者 龙飞