項目中在導入或導出時都會報如下錯誤:java
java.lang.NoClassDefFoundError: Cloud not initialize class org.openxmlformats.schemas.***sheetml.x2006.main.CTWorkbookapache
在本地測試沒有問題,在打包到測試環境就會出以上問題。工具
根據錯誤提示瞭解到NoClassDefFoundError是系統運行期,動態加載類時會提示該錯誤。測試
跟蹤代碼是在CTWorkbookcode
private static SoftReference<SchemaTypeLoader> typeLoader; private static synchronized SchemaTypeLoader getTypeLoader() { SchemaTypeLoader var0 = typeLoader == null ? null : (SchemaTypeLoader)typeLoader.get(); if (var0 == null) { var0 = XmlBeans.typeLoaderForClassLoader(CTWorkbook.class.getClassLoader()); typeLoader = new SoftReference(var0); } return var0; } public static CTWorkbook newInstance() { return (CTWorkbook)getTypeLoader().newInstance(CTWorkbook.type, (XmlOptions)null); }
發現會調用org.apache.xmlbeans.SchemaTypeLoader類,根據類別進行實例化。orm
在測試環境中 (CTWorkbook)getTypeLoader().newInstance(CTWorkbook.type, (XmlOptions)null); 報錯了xml
使用Arthas 工具在測試環境中檢測getTypeLoader()方法也沒發現什麼異常。blog
進入Docker容器看了一下加載的lib包,發現比正常的版本包多出許多重複的包。get
根據比較與查詢,最後發現有一個xbeans與xmlbean包中的實現類路徑相同致使。it
根據包引用關係,反查出xfire:xfire-all 這個包將其餘子包也引入到了工程中,在這個包的引用關係中也找到了xbeans包的引用。
最後修改導入包,排除org.codehaus.xfire其餘包
compile ("org.codehaus.xfire:xfire-all:1.2.6") { exclude group: "org.codehaus.xfire" }