一、原因
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, 觸發對應的測試集進行回歸測試。
四、類加載相關的其他錯誤參照