Spring 6.0.0与ActiveMQ Artemis依赖冲突问题求助
问题描述
我正在将应用从Spring 5.x重构升级至Spring 6.0.0,由于Oracle对Java API的变更,部分依赖被迫调整。目前出现依赖冲突:org.springframework.jms.listener.MessageListenerContainer需要jakarta.jms.ConnectionFactory,但org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory继承的是旧版javax.jms.ConnectionFactory,怀疑缺少某个POM依赖但始终无法解决。
POM片段
<dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-xml</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-core</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-flow</artifactId> <version>1.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-jms</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-jdbc</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-file</artifactId> <version>6.0.0</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>artemis-jms-client</artifactId> <version>2.27.1</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>artemis-spring-integration</artifactId> <version>2.27.1</version> </dependency>
代码片段
// ActiveMQConnectionFactory implements javax.jms.ConnectionFactory @Order(0) public ActiveMQConnectionFactory connectionFactory() throws JMSException { if (connectionFactory == null) { connectionFactory = new ActiveMQConnectionFactory(); PropertyValue pv = configPropertiesService.fetchPropertyValue(PropertyValueConstants.ACTIVEMQ_BROKER_URL, PropertyValueConstants.ACTIVEMQ_BROKER_URL_DEFAULT); PropertyValue pvu = configPropertiesService.fetchPropertyValue(PropertyValueConstants.ACTIVEMQ_BROKER_UNAME, PropertyValueConstants.ACTIVEMQ_BROKER_USERNAME_DEFAULT); PropertyValue pvp = configPropertiesService.fetchPropertyValue(PropertyValueConstants.ACTIVEMQ_BROKER_PASS, PropertyValueConstants.ACTIVEMQ_BROKER_PASS_DEFAULT); connectionFactory.setBrokerURL(pv.getValue()); connectionFactory.setPassword(pvp.getValue()); } return connectionFactory; } @Bean(name = "MessageDrivenAdapter") public MessageListenerContainer getContainer() { DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); container.setConnectionFactory(connectionFactory()); // requires jakarta.jms.ConnectionFactory container.setDestinationName("requestsQueue"); container.setMessageListener(messageListener()); container.setAutoStartup(false); container.setTaskExecutor(stepTaskExecutor); container.setConcurrentConsumers(5); return container; }
解决方案
核心原因
Spring 6基于Jakarta EE 9+规范,所有JMS相关API已从javax.jms迁移至jakarta.jms包。而当前使用的ActiveMQ Artemis 2.27.1版本仍依赖旧的javax.jms API,导致类型不匹配。
具体解决步骤
升级ActiveMQ Artemis版本
ActiveMQ Artemis从2.28.0版本开始,默认提供适配Jakarta EE的JMS客户端实现。将Artemis相关依赖版本升级至2.28.0或更高:<dependency> <groupId>org.apache.activemq</groupId> <artifactId>artemis-jms-client</artifactId> <version>2.28.0</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>artemis-spring-integration</artifactId> <version>2.28.0</version> </dependency>替换ConnectionFactory实现类
升级后,需将代码中的旧版ActiveMQConnectionFactory替换为Jakarta版本的实现,注意包路径变化:import jakarta.jms.ConnectionFactory; import org.apache.activemq.artemis.jakarta.jms.client.ActiveMQConnectionFactory; @Order(0) @Bean public ConnectionFactory connectionFactory() throws JMSException { if (connectionFactory == null) { connectionFactory = new ActiveMQConnectionFactory(); PropertyValue pv = configPropertiesService.fetchPropertyValue(PropertyValueConstants.ACTIVEMQ_BROKER_URL, PropertyValueConstants.ACTIVEMQ_BROKER_URL_DEFAULT); PropertyValue pvu = configPropertiesService.fetchPropertyValue(PropertyValueConstants.ACTIVEMQ_BROKER_UNAME, PropertyValueConstants.ACTIVEMQ_BROKER_USERNAME_DEFAULT); PropertyValue pvp = configPropertiesService.fetchPropertyValue(PropertyValueConstants.ACTIVEMQ_BROKER_PASS, PropertyValueConstants.ACTIVEMQ_BROKER_PASS_DEFAULT); connectionFactory.setBrokerURL(pv.getValue()); connectionFactory.setPassword(pvp.getValue()); } return connectionFactory; }新版本的类路径为
org.apache.activemq.artemis.jakarta.jms.client.ActiveMQConnectionFactory,实现的是jakarta.jms.ConnectionFactory,可直接适配Spring 6的JMS容器要求。清理遗留的javax依赖
执行mvn dependency:tree命令排查项目依赖树,若发现仍有依赖引入javax.jms相关包,需通过<exclusions>标签排除或升级对应依赖,避免javax与jakartaAPI混合导致的冲突。
内容的提问来源于stack exchange,提问作者pojo-guy

