WebLogic下Apache POI 5与XMLBeans类加载冲突运行时异常如何解决?
WebLogic下Apache POI 5与XMLBeans类加载问题解决经验
问题根因
在WebLogic服务器中使用Apache POI 5搭配4.x或5.x版本XMLBeans时,会出现类加载冲突:WebLogic的类加载器会优先加载服务器模块目录下自带的旧版本XMLBeans jar包,最终触发运行时异常。
配置核心注意点
采用EAR包部署应用时,可通过weblogic-application.xml描述符自定义类加载优先级规则,配置过程中需要注意两个容易踩坑的要求:
- 不能仅将POI及直接关联依赖的包设置为应用优先加载。因为
SchemaTypeLoaderImpl类会同时检索两个路径下的资源:新包路径org.apache.xmlbeans.metadata、旧包路径schemaorg_apache_xmlbeans,漏配旧路径会触发更多连锁错误,必须将旧包路径也纳入优先加载配置列表。 - 单纯配置包优先级不足以完全规避旧资源加载问题。
SchemaTypeLoaderImpl的执行逻辑为:先通过ClassLoader.getResource方法加载TypeSystemHolder类,再调用Class.forName方法完成类查找。包优先级配置仅能保证应用自带库的加载顺序优先于服务器底层库,无法阻止类加载器检索、加载服务器侧的过期旧类资源,因此需要针对这些旧资源单独配置优先应用资源规则,阻断对服务器旧版本类的加载。
注意:本方案仅覆盖基础XSSFWorkbook操作XLS文件的使用场景,若使用其他POI功能,需要额外排查对应的资源依赖。
参考配置
可在weblogic-application.xml中加入如下配置,实现应用自带POI/XMLBeans库的优先加载,同时规避服务器内置旧资源的干扰:
<prefer-application-packages> <package-name>org.apache.commons.collections4.*</package-name> <package-name>org.apache.commons.compress.*</package-name> <package-name>org.apache.poi.*</package-name> <package-name>org.apache.xmlbeans.*</package-name> <package-name>org.openxmlformats.*</package-name> <package-name>schemaorg_apache_xmlbeans.*</package-name> </prefer-application-packages> <prefer-application-resources> <resource-name>schemaorg_apache_xmlbeans/system/sXMLCONFIG/TypeSystemHolder.class</resource-name> <resource-name>schemaorg_apache_xmlbeans/system/sXMLLANG/TypeSystemHolder.class</resource-name> <resource-name>schemaorg_apache_xmlbeans/system/sXMLSCHEMA/TypeSystemHolder.class</resource-name> <resource-name>schemaorg_apache_xmlbeans/system/sXMLTOOLS/TypeSystemHolder.class</resource-name> </prefer-application-resources>
内容的提问来源于stack exchange,提问作者roger89
相关产品推荐
相关产品推荐

