在Jetty中引入activemq-all出现NoSuchMethodException的原因
问题分析与解决:Jetty下引入activemq-all触发NoSuchMethodException
问题场景
Jetty环境部署应用时,引入activemq-all依赖后出现NoSuchMethodException,替换为activemq-client依赖后错误消失。
错误信息
Caused by: java.lang.NoSuchMethodException: org.springframework.jms.annotation.JmsBootstrapConfiguration$$EnhancerBySpringCGLIB$$17cf8886.CGLIB$SET_THREAD_CALLBACKS([Lorg.springframework.cglib.proxy.Callback;) at java.lang.Class.getDeclaredMethod(Class.java:2130) at org.springframework.cglib.proxy.Enhancer.getCallbacksSetter(Enhancer.java:912) at org.springframework.cglib.proxy.Enhancer.access$000(Enhancer.java:93) at org.springframework.cglib.proxy.Enhancer$EnhancerFactoryData.<init>(Enhancer.java:502)
原因分析
activemq-all是ActiveMQ的全量依赖包,内置了旧版本的cglib库。而Spring框架依赖的是适配自身版本的cglib,Jetty加载应用时,全量包中的旧版cglib会覆盖Spring自带的cglib版本,导致Spring动态代理生成的类找不到对应方法——不同cglib版本的动态代理方法签名或生成逻辑存在差异,最终触发NoSuchMethodException。
activemq-client是仅包含客户端核心功能的轻量依赖,不附带多余第三方库(如cglib),不会与Spring的依赖产生冲突,因此错误消失。
解决方案
- 优先使用
activemq-client替代activemq-all,只引入必要的客户端功能,从根源避免依赖冲突。 - 若必须使用
activemq-all,通过依赖排除规则移除其中的cglib依赖,确保Spring使用自身适配版本。以Maven为例:
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>你的版本号</version> <exclusions> <exclusion> <groupId>cglib</groupId> <artifactId>cglib</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者yusen zhang
相关产品推荐
相关产品推荐

