问题
在开发环境部署执行代码时,发现部署成功,但是不久后服务直接挂起,我们看到代码中有报错
报错信息我们看到是未能找到某个方法
java.lang.NoSuchMethodError: cn.ctyun.bigdata.emr.order.service.WorkOrderService.findClusterldByworkorder
但是通过排查代码我们看到,我们引用的module中 WorkOrderService里该方法是存在的,那编译时怎么就找不到了呢?
排查到这里,我们忽然想到一个问题,就是类的加载,因为根据JVM的双亲委派机制,相同全限定类名的类默认只会加载一次,会不会是存在的相同的全限定类名,导致该WorkOrderService类加载失败了呢?所以我们再次排查代码后发现的确出现了该种问题!
在我们拆解的另一个module emr-common-basic中,我们也看到了WorkOrderService这个类定义,且使用了同样的全限定类名。cn.ctyun.bigdata.emr.order.service.WorkOrderService,这就导致在jvm加载时,我们加载到了emr-common-basic中的WorkOrderService,所以,在类中无法找到响应的方法。针对此种情况,我们可以更改新加入的WorkOrderService的类名,从命名上直接解决此类冲突,测试后问题即可得到解决。
写在最后
其实在java开发中,难免会遇到同类名命名的情况,有时候可以使用全限定类名的方式解决此类冲突,但是像是文中出现的这种情况,两个类在两个不同的jar里全路径名一致,所以,这种情况最简单的方案是修改类名,比如在我们的项目中,由于是重构代码,则可以将重构的模块类名重新命名即可。