升级JDK11后连接IBM MQ抛出NoSuchMethodException异常
问题背景
- 变更场景:将运行环境从JDK 8、IBM MQ 9.2.0.4、WLS 12升级为JDK 11、IBM MQ 9.2.0.5、WLS 14,同步将应用依赖的
allclient.jar升级至9.2.0.5版本后,尝试建立JMS连接时触发报错。 - 交叉验证结果:相同业务代码在MQ 9.2.0.4 + JDK 8 + WLS 12环境下可正常运行;即使将MQ客户端版本回退至9.2.0.4,搭配JDK 11运行仍会复现相同问题。
- 初步排查结论:报错指向的方法确实存在于当前应用引入的
allclient.jar包中,应用依赖路径内不存在其他版本allclient.jar导致的依赖冲突。
完整报错堆栈
com.ibm.mq.jmqi.JmqiException: CC=2;RC=2195;AMQ9546: Error return code received. [1=java.lang.NoSuchMethodException[com.ibm.mq.jmqi.remote.api.RemoteFAP.<init>(com.ibm.mq.jmqi.JmqiEnvironment, int)],3=Class.getConstructor0] at com.ibm.mq.jmqi.JmqiEnvironment.getInstance(JmqiEnvironment.java:857) at com.ibm.mq.jmqi.JmqiEnvironment.getMQI(JmqiEnvironment.java:702) at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:8437) at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7815) at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl._createConnection(JmsConnectionFactoryImpl.java:322) at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:242) at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6026) at com.ibm.mq.jms.MQConnectionFactory.createConnection(MQConnectionFactory.java:6086) at org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter.doCreateConnection(UserCredentialsConnectionFactoryAdapter.java:188) Caused by: java.lang.NoSuchMethodException: com.ibm.mq.jmqi.remote.api.RemoteFAP.<init>(com.ibm.mq.jmqi.JmqiEnvironment, int) at java.base/java.lang.Class.getConstructor0(Class.java:3349) at java.base/java.lang.Class.getConstructor(Class.java:2151) at com.ibm.mq.jmqi.JmqiEnvironment.getInstance(JmqiEnvironment.java:764)
根因说明
该问题并非应用内依赖冲突导致,核心原因是WLS 14默认采用父类加载器优先的类加载策略,会优先加载WLS自身内置的低版本IBM MQ客户端类,不会加载部署在应用内的高版本allclient.jar中的对应类。WLS内置的旧版RemoteFAP类不存在(JmqiEnvironment, int)参数格式的构造方法,因此抛出NoSuchMethodException。回退MQ客户端版本仍报错的原因也是类加载时始终读取WLS内置的旧版类,和应用内引入的jar包版本无关。
修复步骤
- 登录WLS 14控制台,找到对应部署的应用配置,将类加载策略修改为PARENT_LAST(应用类优先加载),强制JVM优先读取应用自带的依赖包,再读取WLS内置的公共类。
- 检查WLS安装目录下的系统类路径(如
wlserver/server/lib、域目录下的lib文件夹),如果存在旧版本的com.ibm.mq.jmqi.jar、com.ibm.mq.allclient.jar等IBM MQ相关客户端包,直接从该路径下移出,避免类加载时误读取旧版本类。 - 重启WLS服务后重新验证JMS连接即可恢复正常。
内容的提问来源于stack exchange,提问作者Alon
相关产品推荐
相关产品推荐

