POI NoClassDefFoundError: org.openxmlformats.schemas.**sheetml.x2006.main.CTWorkbook

問題現象

項目中在導入或導出時都會報如下錯誤:java

java.lang.NoClassDefFoundError: Cloud not initialize class org.openxmlformats.schemas.***sheetml.x2006.main.CTWorkbookapache

poi CTWorkbook

在本地測試沒有問題,在打包到測試環境就會出以上問題。工具

分析

根據錯誤提示瞭解到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" }

相關文章
相關標籤/搜索