Spring Boot Camel连接IBM MQ遇jakarta.jms.ConnectionFactory类未找到错误
问题分析与解决
核心问题根源
依赖版本不兼容:
- Spring Boot 3.x基于Jakarta EE规范,而你使用的
spring-jms:4.3.3.RELEASE是Spring 4.x版本,依赖旧的javax.jmsAPI,和Spring Boot 3要求的jakarta.jms完全不兼容。 - IBM MQ客户端
com.ibm.mq.allclient:9.1.0.5版本过旧,不支持Jakarta JMS 3.0规范,内部仍依赖javax.jms,导致类加载冲突。 - Camel使用的是里程碑版本
4.0.0-M3,稳定性不足,存在未修复的兼容性问题。
- Spring Boot 3.x基于Jakarta EE规范,而你使用的
配置代码错误:
- 日志初始化引用了被注释的
JmsComponent类,会引发运行错误。 - Keystore加载时直接写
${keyStore}字符串,Spring无法解析占位符,应使用@Value注入的变量。 - 重复设置
TransportType,远程连接仅需保留客户端模式。
- 日志初始化引用了被注释的
解决方案步骤
1. 修正Maven依赖(POM.xml)
替换为以下兼容版本:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.8</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>nl.test</groupId> <artifactId>Testapp</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Testapp</name> <description>Testapp</description> <properties> <java.version>17</java.version> <camel.version>4.0.0</camel.version> </properties> <dependencies> <!-- Camel Spring Boot Starter --> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-spring-boot-starter</artifactId> <version>${camel.version}</version> </dependency> <!-- Camel JMS Starter --> <dependency> <groupId>org.apache.camel.springboot</groupId> <artifactId>camel-jms-starter</artifactId> <version>${camel.version}</version> </dependency> <!-- Spring Boot JMS Starter(自动兼容Jakarta规范) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jms</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- 升级IBM MQ客户端到支持Jakarta的版本 --> <dependency> <groupId>com.ibm.mq</groupId> <artifactId>com.ibm.mq.allclient</artifactId> <version>9.3.3.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.20.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2. 修复配置代码错误
修改JmsConfiguration类:
import com.ibm.mq.MQEnvironment; import com.ibm.msg.client.wmq.common.CommonConstants; import org.apache.camel.component.jms.JmsComponent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.ibm.mq.jms.MQQueueConnectionFactory; import org.springframework.jms.annotation.EnableJms; import com.ibm.msg.client.wmq.WMQConstants; import javax.net.ssl.*; import java.security.KeyStore; @EnableJms @Configuration public class JmsConfiguration { private static final Logger LOG = LoggerFactory.getLogger(JmsConfiguration.class); private String host = "xxx"; private int port = 4510; private String queueManager = "xxx"; private String channel = "xxx"; private String sslCipherSuite = "TLS_RSA_WITH_AES_256_CBC_SHA256"; @Value("${keyStore}") private String keyStorePath; @Value("${keyStorePassword}") private String keyStorePassword; @Value("${trustStore}") private String trustStorePath; @Value("${trustStorepassword}") private String trustStorePassword; @Bean public JmsComponent mq() { JmsComponent jmsComponent = new JmsComponent(); jmsComponent.setConnectionFactory(mqQueueConnectionFactory()); return jmsComponent; } @Bean public MQQueueConnectionFactory mqQueueConnectionFactory() { MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory(); mqQueueConnectionFactory.setHostName(host); try { // 加载KeyStore KeyStore keyStore = KeyStore.getInstance("JKS"); keyStore.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(keyStorePath), keyStorePassword.toCharArray()); // 创建KeyManager KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); keyManagerFactory.init(keyStore, keyStorePassword.toCharArray()); KeyManager[] km = keyManagerFactory.getKeyManagers(); // 加载TrustStore KeyStore trustStore = KeyStore.getInstance("JKS"); trustStore.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(trustStorePath), trustStorePassword.toCharArray()); // 创建TrustManager TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509"); trustManagerFactory.init(trustStore); TrustManager[] tm = trustManagerFactory.getTrustManagers(); // 初始化SSLContext SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(km, tm, null); SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); mqQueueConnectionFactory.setPort(port); mqQueueConnectionFactory.setChannel(channel); mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT); mqQueueConnectionFactory.setObjectProperty(WMQConstants.WMQ_SSL_SOCKET_FACTORY, sslSocketFactory); mqQueueConnectionFactory.setSSLCipherSuite(sslCipherSuite); mqQueueConnectionFactory.setQueueManager(queueManager); MQEnvironment.sslSocketFactory = sslSocketFactory; } catch (Exception e) { LOG.error("初始化MQ连接工厂失败", e); } return mqQueueConnectionFactory; } }
3. 额外注意事项
- 确保
application.properties/application.yml中配置了正确的密钥库参数。 - 若使用非JKS类型密钥库,修改
KeyStore.getInstance()的参数。 - 验证IBM MQ服务器的SSL配置,确保
sslCipherSuite与服务器端一致。
内容的提问来源于stack exchange,提问作者Beerus239
相关产品推荐
相关产品推荐

