Tomcat 无法开始使用 Eclipse、JRebel 和 Spring Boot

Tomcat fails to start using Eclipse, JRebel, and Spring Boot

我正在Eclipse中构建一个Spring Boot应用程序运行 JRebel和Tomcat 9.我已经将JRebel性质添加到我的项目中,并确认生成的rebel.xml 是正确的。当我将我的应用程序部署到 Tomcat 并启动它时,我看到了这个错误堆栈。

2016-10-12 09:55:10.689 ERROR [8] [SDK-CBP] Class 'org.springframework.jmx.export.MBeanExporter' could not be processed by org.zeroturnaround.javarebel.integration.spring.beans.cbp.MBeanExporterCBP@org.apache.catalina.loader.WebappClassLoader@35310f27: org.zeroturnaround.bundled.javassist.CannotCompileException: [source error] setRegistrationBehavior(int) not found in org.springframework.jmx.export.MBeanExporter
    at org.zeroturnaround.bundled.javassist.CtNewMethod.make(SourceFile:79)
    at org.zeroturnaround.bundled.javassist.CtNewMethod.make(SourceFile:45)
    at org.zeroturnaround.javarebel.integration.spring.beans.cbp.MBeanExporterCBP.process(MBeanExporterCBP.java:40)
    at org.zeroturnaround.javarebel.integration.support.JavassistClassBytecodeProcessor.process(SourceFile:117)
    at com.zeroturnaround.javarebel.rx.a(SourceFile:365)
    at com.zeroturnaround.javarebel.rx.a(SourceFile:354)
    at com.zeroturnaround.javarebel.rx.a(SourceFile:322)
    at com.zeroturnaround.javarebel.SDKIntegrationImpl.runBytecodeProcessors(SourceFile:33)
    at com.zeroturnaround.javarebel.px.transform(SourceFile:94)
    at java.lang.ClassLoader.defineClass(ClassLoader.java)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2452)
    at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:854)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1264)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1147)
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:250)
    at org.springframework.util.ClassUtils.isPresent(ClassUtils.java:327)
    at org.springframework.boot.autoconfigure.condition.OnClassCondition$MatchType.matches(OnClassCondition.java:123)
    at org.springframework.boot.autoconfigure.condition.OnClassCondition.getMatchingClasses(OnClassCondition.java:93)
    at org.springframework.boot.autoconfigure.condition.OnClassCondition.getMatchOutcome(OnClassCondition.java:50)
    at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47)
    at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:102)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:209)
    at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:539)
    at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:482)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:191)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:324)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:246)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681)
    at org.springframework.context.support.AbstractApplicationContext.__refresh(AbstractApplicationContext.java:523)
    at org.springframework.context.support.AbstractApplicationContext.jrLockAndRefresh(AbstractApplicationContext.java)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:736)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
    at org.springframework.boot.web.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:151)
    at org.springframework.boot.web.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:131)
    at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:86)
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:171)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5185)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1399)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: compile error: setRegistrationBehavior(int) not found in org.springframework.jmx.export.MBeanExporter
    at org.zeroturnaround.bundled.javassist.compiler.TypeChecker.atMethodCallCore(SourceFile:749)
    at org.zeroturnaround.bundled.javassist.compiler.TypeChecker.atCallExpr(SourceFile:695)
    at org.zeroturnaround.bundled.javassist.compiler.JvstTypeChecker.atCallExpr(SourceFile:157)
    at org.zeroturnaround.bundled.javassist.compiler.ast.CallExpr.accept(SourceFile:46)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.doTypeCheck(SourceFile:242)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.atStmnt(SourceFile:330)
    at org.zeroturnaround.bundled.javassist.compiler.ast.Stmnt.accept(SourceFile:50)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.atStmnt(SourceFile:351)
    at org.zeroturnaround.bundled.javassist.compiler.ast.Stmnt.accept(SourceFile:50)
    at org.zeroturnaround.bundled.javassist.compiler.MemberCodeGen.atTryStmnt(SourceFile:204)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.atStmnt(SourceFile:367)
    at org.zeroturnaround.bundled.javassist.compiler.ast.Stmnt.accept(SourceFile:50)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.atStmnt(SourceFile:351)
    at org.zeroturnaround.bundled.javassist.compiler.ast.Stmnt.accept(SourceFile:50)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.atIfStmnt(SourceFile:398)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.atStmnt(SourceFile:355)
    at org.zeroturnaround.bundled.javassist.compiler.ast.Stmnt.accept(SourceFile:50)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.atStmnt(SourceFile:351)
    at org.zeroturnaround.bundled.javassist.compiler.ast.Stmnt.accept(SourceFile:50)
    at org.zeroturnaround.bundled.javassist.compiler.MemberCodeGen.atTryStmnt(SourceFile:204)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.atStmnt(SourceFile:367)
    at org.zeroturnaround.bundled.javassist.compiler.ast.Stmnt.accept(SourceFile:50)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.atStmnt(SourceFile:351)
    at org.zeroturnaround.bundled.javassist.compiler.ast.Stmnt.accept(SourceFile:50)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.atMethodBody(SourceFile:292)
    at org.zeroturnaround.bundled.javassist.compiler.CodeGen.atMethodDecl(SourceFile:274)
    at org.zeroturnaround.bundled.javassist.compiler.ast.MethodDecl.accept(SourceFile:44)
    at org.zeroturnaround.bundled.javassist.compiler.Javac.compileMethod(SourceFile:169)
    at org.zeroturnaround.bundled.javassist.compiler.Javac.compile(SourceFile:95)
    at org.zeroturnaround.bundled.javassist.CtNewMethod.make(SourceFile:74)
    ... 49 more

编辑:我将 JRebel 用于 Eclipse 插件 6.5.1 和 Spring Boot 2.0。0.BUILD-SNAPSHOT

JRebel 无法检测 class,因为 MBeanRegistrationSupport#setRegistrationBehavior 方法已被 b5db5d 在 spring-框架开发分支上提交删除。

我们更新了 Spring 集成,JRebel Nighly build(选择独立 jar)应该可以正常工作。

修复将包含在我们计划下周发布的 JRebel 6.5.2 中。

感谢您的错误报告,如果您有任何问题questions/issue请写信给支持@zeroturnaround.com。