You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liberty环境下ECIConnectionFactory类转换异常问题咨询

解决Liberty中ECIConnectionFactory类转换异常问题

问题背景

执行代码eisDci = (ECIConnectionFactory)ctx.lookup(eisn);时抛出类转换异常:

java.lang.ClassCastException: com.ibm.connector2.cics.ECIConnectionFactory incompatible with com.ibm.connector2.cics.ECIConnectionFactory

代码中eisDci定义为private static ECIConnectionFactory eisDci = null;,Server.xml中连接配置如下:

<connectionFactory id="DCIXxxxECI" jndiName="eis/DCIXxxxECI">
        <properties.cicseci ServerName="XXXX" TPNName="xx" connectionUrl="url" portNumber="2006"/>
</connectionFactory>

已确认问题源于类加载器隔离导致的类实例不兼容,排查未发现重复库,但问题仍存在。

核心原因

该异常本质是同一全限定类名被两个不同类加载器加载,JVM会将它们视为完全独立的类型,即使类的字节码完全一致。在Liberty环境中,常见触发场景包括:

  • 应用自身lib目录包含cicseci相关jar,与服务器资源适配器的jar冲突
  • 资源适配器配置范围错误,导致类加载器隔离失效
  • 共享库配置不当,多类加载器重复加载同一jar

解决方案

1. 清理应用自带的冲突依赖

检查应用WAR/EAR包的WEB-INF/lib(或APP-INF/lib)目录,若存在包含com.ibm.connector2.cics类的jar文件,直接删除。这类类应由Liberty的资源适配器提供,无需应用自带。

2. 修正资源适配器配置范围

确保Server.xml中<resourceAdapter>配置为全局可见,避免应用类加载器重复加载:

<resourceAdapter id="cicseci" location="${server.config.dir}/resources/cicseci.rar">
    <classloader apiTypeVisibility="+ibm-api, +api, +third-party"/>
</resourceAdapter>

同时确认<connectionFactory>关联的是该全局资源适配器,而非应用局部配置的适配器。

3. 排查类加载器重复加载情况

通过Liberty的类加载器 dump 功能定位问题:

  • 在Server.xml中添加:<dumpClassLoading enabled="true" />
  • 启动服务器并触发异常后,查看生成的类加载器报告,查找com.ibm.connector2.cics.ECIConnectionFactory被哪些类加载器加载。
  • 根据报告调整共享库的scope,避免跨类加载器重复加载同一jar。

4. 调整应用类加载器策略

将应用类加载器改为parentFirst模式,让应用优先使用服务器类加载器提供的类:

<application id="your-app" name="your-app" location="your-app.war">
    <classloader delegation="parentFirst" />
</application>

Liberty默认使用parentLast,此配置可避免应用自带类覆盖服务器提供的类。

5. 清理Liberty缓存

删除服务器workarea和logs目录下的缓存文件,重启服务器,清除旧的类加载缓存。

内容的提问来源于stack exchange,提问作者Lastmonkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:00:24