searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Java项目中同类名加载问题

2023-12-12 07:09:11
4
0

问题

在开发环境部署执行代码时,发现部署成功,但是不久后服务直接挂起,我们看到代码中有报错

报错信息我们看到是未能找到某个方法
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里全路径名一致,所以,这种情况最简单的方案是修改类名,比如在我们的项目中,由于是重构代码,则可以将重构的模块类名重新命名即可。

0条评论
0 / 1000
徐****倩
8文章数
0粉丝数
徐****倩
8 文章 | 0 粉丝
原创

Java项目中同类名加载问题

2023-12-12 07:09:11
4
0

问题

在开发环境部署执行代码时,发现部署成功,但是不久后服务直接挂起,我们看到代码中有报错

报错信息我们看到是未能找到某个方法
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里全路径名一致,所以,这种情况最简单的方案是修改类名,比如在我们的项目中,由于是重构代码,则可以将重构的模块类名重新命名即可。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0