You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.jar
  • poi-ooxml-3.17.jar
  • poi-ooxml-schemas-3.17.jar
  • openxml4j-1.3.2.jar(POI 3.17对应的版本)
  • xmlbeans-2.6.0.jar
  • commons-codec-1.10.jar
  • commons-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管理控制台确认类加载的来源:

  1. 登录WebLogic控制台
  2. 进入部署 -> 选中你的应用 -> 点击类加载器标签
  3. 点击查看类加载情况,搜索org.apache.poi.openxml4j.opc.OPCPackage
  4. 查看该类对应的jar包路径,确认是来自你应用的WEB-INF/lib,而不是WebLogic的系统库

按照这些步骤操作,基本上就能解决这个冲突问题了,毕竟本地Tomcat正常说明你的代码和依赖本身是没问题的,就是WebLogic的类加载优先级搞的鬼。

内容的提问来源于stack exchange,提问作者Mohammed Al-Hanabi

火山引擎 最新活动