POI 3.17及旧版本在WebLogic 12.2服务器上运行异常求助
解决WebLogic 12.2中POI加载Excel的ExceptionInInitializerError问题
这种问题我碰到过好多次,核心原因几乎都是WebLogic自带的旧版本POI/相关依赖与你应用打包的版本冲突——毕竟WebLogic会优先加载自身容器内的类,而不是你应用里的,这和Tomcat的类加载逻辑不一样(Tomcat默认完全依赖应用打包的库)。下面给你一步步的解决方案:
1. 配置WebLogic优先加载应用的依赖包
最直接的办法是在你的应用里添加weblogic.xml文件(放在WEB-INF目录下),指定让WebLogic优先使用应用打包的库,而不是它自带的。具体配置如下:
<?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.7/weblogic-web-app.xsd"> <container-descriptor> <prefer-application-packages> <!-- POI核心包 --> <package-name>org.apache.poi.*</package-name> <!-- OPC/OpenXML相关包 --> <package-name>org.openxml4j.*</package-name> <!-- XMLBeans依赖(POI OOXML必须的) --> <package-name>org.apache.xmlbeans.*</package-name> <!-- 辅助依赖包,避免冲突 --> <package-name>org.apache.commons.codec.*</package-name> <package-name>org.apache.commons.collections4.*</package-name> </prefer-application-packages> </container-descriptor> </weblogic-web-app>
这个配置会强制WebLogic加载你应用里的这些包,而不是它自带的旧版本。
2. 确认应用依赖的完整性与兼容性
确保你应用打包的POI相关jar包是完整且版本匹配的。以POI 3.17为例,你需要包含以下核心jar:
poi-3.17.jarpoi-ooxml-3.17.jarpoi-ooxml-schemas-3.17.jaropenxml4j-1.3.2.jar(POI 3.17对应的版本)xmlbeans-2.6.0.jarcommons-codec-1.10.jarcommons-collections4-4.1.jar
如果用Maven的话,直接引入poi-ooxml依赖即可,它会自动拉取所有必要的子依赖:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency>
3. 清理WebLogic缓存并重启服务器
WebLogic有时候会缓存旧的类文件,导致配置修改后不生效。你需要:
- 停止WebLogic服务器
- 删除
$DOMAIN_HOME/servers/[你的服务器名称]/tmp和$DOMAIN_HOME/servers/[你的服务器名称]/cache目录下的所有内容 - 重新启动服务器,重新部署应用
4. 验证类加载来源(可选)
如果还是有问题,可以通过WebLogic管理控制台确认类加载的来源:
- 登录WebLogic控制台
- 进入部署 -> 选中你的应用 -> 点击类加载器标签
- 点击查看类加载情况,搜索
org.apache.poi.openxml4j.opc.OPCPackage - 查看该类对应的jar包路径,确认是来自你应用的
WEB-INF/lib,而不是WebLogic的系统库
按照这些步骤操作,基本上就能解决这个冲突问题了,毕竟本地Tomcat正常说明你的代码和依赖本身是没问题的,就是WebLogic的类加载优先级搞的鬼。
内容的提问来源于stack exchange,提问作者Mohammed Al-Hanabi




