Spring Boot 3.1.0迁移后ActiveMQ JMS选择器出现类找不到异常
Spring Boot 3.1.0迁移后JMS XPath选择器类找不到问题
问题重现
将带有XPath选择器的JMS监听器迁移至Spring Boot 3.1.0后,启动时抛出类找不到异常,无法加载默认XPath解析器。
相关代码与配置
JMS监听器代码
@JmsListener(destination = "${queue.demo.task.destination}", selector = "${queue.demo.task.selector}") public void handle(@Payload String taskConfirmation, Message jmsMessage) throws JMSException { ActiveMQTextMessage activeMQTextMessage = (ActiveMQTextMessage)jmsMessage; LOGGER.debug(ListenerUtility.getLoginfo(activeMQTextMessage)); messageService.createTaskDemo(taskConfirmation, jmsMessage.getJMSDestination().toString(), XYZ) .subscribeOn(Schedulers.boundedElastic()).subscribe(); }
YAML配置
queue: demo: task: destination: ${default.queue.demo.task.destination:${namespace:default}.ABC} selector: "XPATH '//msg/Header/messageType=\"123\"'"
报错日志
2023-06-27 12:25:52,692 ERROR [o.a.activemq.filter.XPathExpression ,Container#13-14] (,,,,,) : Default XPath evaluator could not be loaded java.lang.ClassNotFoundException: org.apache.activemq.filter.JAXPXPathEvaluator at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:587) at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:133) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
解决方案
原因
Spring Boot 3.1.0适配的ActiveMQ客户端版本中,JAXPXPathEvaluator类的包路径从org.apache.activemq.filter变更为org.apache.activemq.util,且默认依赖中不再包含XPath解析模块,导致类加载失败。
修复步骤
补充依赖
如果使用Maven,在pom.xml中添加以下依赖:<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-client</artifactId> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-xpath</artifactId> </dependency>Gradle项目则添加:
implementation 'org.apache.activemq:activemq-client' implementation 'org.apache.activemq:activemq-xpath'指定XPath解析类
若添加依赖后仍有问题,通过系统属性指定新的解析类:- 在启动类中添加代码:
System.setProperty("org.apache.activemq.xpath.evaluator", "org.apache.activemq.util.JAXPXPathEvaluator"); - 或添加JVM启动参数:
-Dorg.apache.activemq.xpath.evaluator=org.apache.activemq.util.JAXPXPathEvaluator
- 在启动类中添加代码:
校验选择器格式
YAML配置中选择器的转义写法可优化为单引号包裹,避免转义错误:selector: 'XPATH ''//msg/Header/messageType="123"'''
内容的提问来源于stack exchange,提问作者user2158105
相关产品推荐
相关产品推荐

