NoClassDefFoundError 无法初始化 class com.ibm.mq.headers.internal.HeaderType

NoClassDefFoundError Could not initialize class com.ibm.mq.headers.internal.HeaderType

我们已经升级到 IBM MQ8 并且在我们的项目中有以下依赖项。存在以下依赖项

com.ibm.disthub2.dhbcore
com.ibm.mq.jmqi
com.ibm.mqjms
ibm-jaxrpc-client
com.ibm.mq
com.ibm.mq.headers
com.ibm.mq.pcf
com.ibm.mq.commonservices

然而,虽然 运行 是主程序,但它提供了 NoDefFoundError,尽管在类路径中提供了 jars。

Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.ibm.mq.headers.internal.HeaderType
        at com.ibm.mq.headers.pcf.PCFMessage.<init>(PCFMessage.java:77) ~[com.ibm.mq.headers-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.mq.headers.pcf.PCFMessage.<init>(PCFMessage.java:132) ~[com.ibm.mq.headers-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.mq.ese.service.PolicyServiceImpl.policyFromPcf(PolicyServiceImpl.java:575) ~[com.ibm.mq.jmqi-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.mq.ese.intercept.JmqiOpenInterceptorImpl.storeSecurityInfoInSmqiObject(JmqiOpenInterceptorImpl.java:359) ~[com.ibm.mq.jmqi-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.mq.ese.intercept.JmqiOpenInterceptorImpl.readPolicyIfAvailable(JmqiOpenInterceptorImpl.java:321) ~[com.ibm.mq.jmqi-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.mq.ese.intercept.JmqiOpenInterceptorImpl.afterSpiOpen(JmqiOpenInterceptorImpl.java:203) ~[com.ibm.mq.jmqi-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.mq.ese.jmqi.InterceptedJmqiImpl.spiOpen(InterceptedJmqiImpl.java:411) ~[com.ibm.mq.jmqi-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.mq.ese.jmqi.ESEJMQI.spiOpen(ESEJMQI.java:513) ~[com.ibm.mq.jmqi-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.msg.client.wmq.internal.WMQMessageProducer$SpiIdentifiedProducerShadow.initialise(WMQMessageProducer.java:762) ~[com.ibm.mqjms-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.msg.client.wmq.internal.WMQMessageProducer.<init>(WMQMessageProducer.java:995) ~[com.ibm.mqjms-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.msg.client.wmq.internal.WMQSession.createProducer(WMQSession.java:889) ~[com.ibm.mqjms-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.msg.client.jms.internal.JmsSessionImpl.createProducer(JmsSessionImpl.java:1232) ~[com.ibm.mqjms-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.msg.client.jms.internal.JmsQueueSessionImpl.createSender(JmsQueueSessionImpl.java:136) ~[com.ibm.mqjms-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.mq.jms.MQQueueSession.createSender(MQQueueSession.java:153) ~[com.ibm.mqjms-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at com.ibm.mq.jms.MQQueueSession.createProducer(MQQueueSession.java:254) ~[com.ibm.mqjms-7.5.0.6.jar:7.5.0.6 - p750-006-160226]
        at org.springframework.jms.core.JmsTemplate.doCreateProducer(JmsTemplate.java:1114) ~[spring-jms-4.3.4.RELEASE.jar:4.3.4.RELEASE]
        at org.springframework.jms.core.JmsTemplate.createProducer(JmsTemplate.java:1095) ~[spring-jms-4.3.4.RELEASE.jar:4.3.4.RELEASE]
        at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.doSendToDestination(JmsConfiguration.java:482) ~[camel-jms-2.17.0.jar:2.17.0]
        at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.access0(JmsConfiguration.java:428) ~[camel-jms-2.17.0.jar:2.17.0]
        at org.apache.camel.component.jms.JmsConfiguration$CamelJmsTemplate.doInJms(JmsConfiguration.java:442) ~[camel-jms-2.17.0.jar:2.17.0]
        at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:484) ~[spring-jms-4.3.4.RELEASE.jar:4.3.4.RELEASE]
  1. 您是否将 MQ 服务器升级到 v8 或将 MQ 客户端升级到 v8 或两者?
  2. 他们运行在同一台机器上吗?
  3. 堆栈跟踪显示所有 jar 文件都已重命名以包含字符串 7.5.0.6,这表明它们来自 MQ v7.5.0.6 MQ 客户端安装。 IBM 不支持从 v8.0 之前的标准安装位置移动 jar 文件。
  4. 在 MQ v8.0 和更高版本中,IBM 仅提供 java 可以位于任何位置的安装。
  5. 在 MQ v8.0 和更高版本中,IBM 还允许将文件 com.ibm.mq.allclient.jarcom.ibm.mq.traceControl.jar 从完整的客户端或服务器安装到同一企业中的其他服务器和位置,上述文件包含以前在单独的 jar 文件中的所有 类。

建议删除名称中带有 7.5.0.6 的所有 jar 文件,并保留 IBM 随 MQ v8.0 提供的两个 jar 文件。

根据 OP @IMahajan,升级了以下组件:Spring、Camel、Java 和所有相关的 jar,包括 JMS。

非常感谢您的意见。我发现分辨率是罐子的版本。我把高版本的com.ibm.mq.headers(包含HeaderType.Class)提供给V8,在class路径下提供。有效。我认为 mq8 与 v7.5.0.6 不兼容。如有不同,请更新。