WildFly部署WAR报ActiveMQ getStore() NoSuchMethodError排查
问题根因
这个NoSuchMethodError和缺少依赖无关,是ActiveMQ依赖版本冲突导致的:
- 你同时引入了5.5.1版本的
activemq-core和5.10.1版本的其他ActiveMQ组件。activemq-core是ActiveMQ 5.8之前的单块核心包,5.8之后官方已经把它拆分为activemq-broker、activemq-client等独立组件,5.5.1版本中的TempUsage类根本没有返回PListStore类型的getStore()方法——这个方法是5.10.x版本新增的。类加载时优先加载了旧版本的TempUsage,运行时调用新版本方法就会直接抛出方法不存在的错误,是本次报错的核心诱因。 - 引入的2.19.0版本
artemis-jms-client属于跨大版本冗余依赖。Artemis是ActiveMQ的下一代Broker实现,和经典ActiveMQ 5.x的类结构、包路径不完全兼容,和5.x版本依赖混放会进一步加剧类路径冲突。 - WildFly作为全量JavaEE服务器,自身模块已经内置了一套ActiveMQ Artemis实现,如果没有做类加载隔离,服务器内置的类和War包内打入的ActiveMQ类也会出现版本冲突。
之前移除activemq-all换单独依赖的思路是对的,问题出在没有清理干净旧版本依赖、没有对齐所有组件版本。
解决步骤
- 第一步:删除冗余旧版核心依赖
直接移除pom中5.5.1版本的activemq-core依赖,这个包和你使用的5.10.1系列拆分组件完全重复,版本差了5个小版本,是冲突的核心来源。 - 第二步:清理跨大版本不兼容依赖
移除2.19.0版本的artemis-jms-client依赖。如果你对接的是经典版ActiveMQ 5.10.1,只需要引入同版本的activemq-client作为客户端依赖即可,不需要混入Artemis的客户端包。 - 第三步:对齐所有ActiveMQ组件版本
将所有保留的ActiveMQ相关依赖版本统一为5.10.1,不要出现跨小版本混用的情况,修正后的依赖参考:
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-broker</artifactId> <version>5.10.1</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-client</artifactId> <version>5.10.1</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>5.10.1</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-spring</artifactId> <version>5.10.1</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-kahadb-store</artifactId> <version>5.10.1</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-jdbc-store</artifactId> <version>5.10.1</version> </dependency>
- 第四步:修复SLF4J重复绑定问题
之前使用activemq-all触发的SLF4J重复绑定,不需要回退到旧版activemq-core,只需要在所有引入的ActiveMQ依赖中排除掉自带的SLF4J实现包即可,以activemq-broker为例:
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-broker</artifactId> <version>5.10.1</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency>
其余ActiveMQ依赖做同样的排除处理,全局只保留项目统一使用的一份SLF4J实现即可解决重复绑定问题。
- 第五步:配置WildFly类加载隔离
如果完成上述步骤后仍然存在类冲突,在War包的WEB-INF目录下新增jboss-deployment-structure.xml配置文件,排除WildFly自带的ActiveMQ相关模块,强制应用使用自身War包内打入的依赖,配置参考:
<?xml version="1.0" encoding="UTF-8"?> <jboss-deployment-structure> <deployment> <exclusions> <module name="org.apache.activemq"/> <module name="org.apache.activemq.artemis"/> </exclusions> </deployment> </jboss-deployment-structure>
内容的提问来源于stack exchange,提问作者rpjs
相关产品推荐
相关产品推荐

