mybatis啟動報錯
1. DocumentBuilderFactory加載順序
- 使用 javax.xml.parsers.DocumentBuilderFactory 系統屬性;
System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
- 使用 JRE 文件夾中的屬性文件 "lib/jaxp.properties"。此配置文件格式為標准的 java.util.Properties 且包含實現類的完全限定名,其中實現類的鍵是上述定義的系統屬性。 JAXP 實現只讀取一次 jaxp.properties 文件,然后緩存其值供以后使用。如果首次嘗試讀取文件時,文件不存在,則不會再次嘗試檢查該文件是否存在。首次讀取 jaxp.properties 后,其中的屬性值不能再更改;
文件內容如下:
javax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
- 使用 Services API(在 JAR 規范中進行了詳細描述)來確定類名稱。Services API 將查找在運行時可用的 jar 中 META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文件中的類名;
文件內容如下:
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
- 最后使用平台默認的 DocumentBuilderFactory 實例;
com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
2. 引起問題的原因
項目引入了xercesImpl,在該jar中有Services API的定義,導致DocumentBuilderFactory初始化為org.apache.xerces.jaxp.DocumentBuilderFactoryImpl,而在這個實現類中沒有setFeature方法
3. 嘗試解決方法
- 項目中去除xercesImpl依賴
驗證結果:無法解決
問題原因:好多地方有對xercesImpl的依賴,項目中去除對該JAR的直接依賴解決不了問題,如果完全去除會對其它功能有影響;
依賴xercesImpl的JAR
commons-dbcp
jaxen
xtom
- 在項目中增加Services API定義,把其設置為com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
驗證結果:無法解決
問題原因:實際還是使用了xercesImpl中定義的Services API
- 調整DocumentBuilderFactory的創建方式
DocumentBuilderFactory.newInstance("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
驗證結果:問題解決
- 升級xercesImpl為有setFeature方法的高版本