You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring 6.0.0与ActiveMQ Artemis依赖冲突问题求助

Spring 6升级后JMS ConnectionFactory类型不兼容问题

问题描述

我正在将应用从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,导致类型不匹配。

具体解决步骤

  1. 升级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>
    
  2. 替换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容器要求。

  3. 清理遗留的javax依赖
    执行mvn dependency:tree命令排查项目依赖树,若发现仍有依赖引入javax.jms相关包,需通过<exclusions>标签排除或升级对应依赖,避免javax与jakarta API混合导致的冲突。

内容的提问来源于stack exchange,提问作者pojo-guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:10:20