启动XRebel时抛出异常,Spring Boot与Tomcat版本兼容问题求助
问题:XRebel 2024.3.0 与 Spring Boot 3.2.6(内嵌Tomcat 10.1.24)启动时抛出方法找不到异常
启动应用时出现如下异常:
XRebel: ERROR Class 'org.apache.catalina.connector.Response' could not be processed by com.zeroturnaround.xrebel.reqint.http.XrHttpServletResponseCBP@null: com.zeroturnaround.xrebel.bundled.javassist.NotFoundException: setStatus(..) is not found in org.apache.catalina.connector.Response at com.zeroturnaround.xrebel.bundled.javassist.CtClassType.getDeclaredMethod(XRebel:1363) at com.zeroturnaround.xrebel.reqint.http.XrHttpServletResponseCBP.a(XRebel:88) at com.zeroturnaround.xrebel.reqint.http.XrHttpServletResponseCBP.process(XRebel:71) at com.zeroturnaround.xrebel.cbp.JavassistClassBytecodeProcessor.process(XRebel:48) at com.zeroturnaround.xrebel.bootstrap.q.a(XRebel:101) at com.zeroturnaround.xrebel.bootstrap.q.a(XRebel:29) at com.zeroturnaround.xrebel.bootstrap.q$1.a(XRebel:77) at com.zeroturnaround.xrebel.bootstrap.q$1.a(XRebel:66) at com.zeroturnaround.xrebel.nq$2.run(XRebel:35) at com.zeroturnaround.xrebel.security.sdk.SecurityController.doWithoutSecurityManager(XRebel:32) at com.zeroturnaround.xrebel.nu.a(XRebel:18) at com.zeroturnaround.xrebel.nq.a(XRebel:32) at com.zeroturnaround.xrebel.bootstrap.q.transform(XRebel:66) at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:244) at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188) at java.instrument/sun.instrument.InstrumentationImpl._jrDoTransform(InstrumentationImpl.java:541) at java.instrument/sun.instrument.InstrumentationImpl._jrTransform(InstrumentationImpl.java:42001) at java.base/com.zeroturnaround.jrebelbase.reorder.b.transform(SourceFile:180) at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:43001) at java.base/java.lang.ClassLoader.defineClass1(Native Method) at java.base/java.lang.ClassLoader._jr$defineClass(ClassLoader.java:1017) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:43016) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) at org.apache.catalina.connector.Connector.createResponse(Connector.java:917) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:308) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:840)
原因分析
Tomcat 10.1.24 对org.apache.catalina.connector.Response类的setStatus方法签名进行了调整,而XRebel 2024.3.0的字节码增强逻辑未适配该版本的方法变更,导致内置的Javassist库无法找到目标方法,触发异常。
解决方案
- 升级XRebel到兼容版本:更新XRebel至官方发布的适配Tomcat 10.1.x的版本(如2024.4及以后版本),新版本通常会修复此类框架兼容性问题。
- 排除目标类的XRebel增强:在
xrebel.properties配置文件中添加排除规则,禁止XRebel对org.apache.catalina.connector.Response进行字节码处理:xrebel.exclude.classes=org.apache.catalina.connector.Response - 降级Tomcat版本:若暂时无法升级XRebel,可将Spring Boot依赖的Tomcat版本降级至XRebel兼容的版本(如10.1.20及以下)。修改项目构建文件:
Maven示例:
Gradle示例:<properties> <tomcat.version>10.1.20</tomcat.version> </properties>ext['tomcat.version'] = '10.1.20' - 清理JRebel缓存:若之前尝试过其他JRebel版本,删除项目根目录下的
.rebel文件夹及用户目录中的JRebel缓存,避免旧配置残留引发冲突。
内容的提问来源于stack exchange,提问作者loki
相关产品推荐
相关产品推荐

