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
相关产品推荐
相关产品推荐

