一、原因

classloader加载的类里找不到对应的方法,要么是没有对应的方法函数,要么是由于包冲突,引入了错误的包,加载了错误的类。

如果是第一种可以通过查看源码或者jad命令/工具(jd-gui)反编译jar看一下。

image

这个时候将会 no such method method3 exception,在compile的时候,没有问题。在method3被user1调用的时候,类加载时候,

class loader的时候会load xml-beans-3.1.0.jar,load了错误了类,自然找不到method3。


二、解决思路:

1)首先通过shade-pom.xml打包,然后通过下面的命令查看一下是否引入了对应的包

mvn dependency:list -f shaded-pom.xml -DskipTests -Dmaven.javadoc.skip=true -DreleaseVersion=xxxx | grep "xmlbean"


2)确认引入的版本

mvn dependency:tree -Dincludes=org.apache.xmlbeans

image

然后反编译对应版本,查看对应类的方法有哪些。


3)解决方法:

保证 a和b 使用一样的xml-beans版本,或者,通过exclusions标签切断依赖的传递性, 控制end common lib中引入的xml-beans的版本。

https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html


三、怎么预防在类加载阶段的错误

如果是没有这个方法,编译就通不过。编译通过,在真正使用的时候出错。这就需要对code写好充分的unit test case,

并用testng framework ci工具,把unit test case组织成测试集,每次code change, 触发对应的测试集进行回归测试。


四、类加载相关的其他错误参照

https://fredal.xin/classloader-error

posted on 2021-09-15 14:42  维也纳下午茶  阅读(3685)  评论(0编辑  收藏  举报