一、原因
classloader加载的类里找不到对应的方法,要么是没有对应的方法函数,要么是由于包冲突,引入了错误的包,加载了错误的类。
如果是第一种可以通过查看源码或者jad命令/工具(jd-gui)反编译jar看一下。
这个时候将会 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
然后反编译对应版本,查看对应类的方法有哪些。
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, 触发对应的测试集进行回归测试。
四、类加载相关的其他错误参照