Spring非Boot+Vaadin项目迁移至Tomcat10部署异常求助
Spring非Boot项目迁移Tomcat10 + Vaadin24问题排查方案
一、VaadinContext中Lookup实例缺失的IllegalStateException
- 确保
vaadin-spring与Vaadin核心版本(24.3.3)完全匹配,版本不一致会导致上下文初始化逻辑冲突。 - 处理Vaadin8兼容性包冲突:
vaadin-compatibility-server:8.23.0和Vaadin24的上下文机制不兼容,优先逐步替换代码中Vaadin8的API为Vaadin24替代方案;若暂时无法替换,需在web.xml中排除Vaadin24的自动监听器,手动配置兼容性上下文。 - 适配Tomcat10的Jakarta Servlet API:Tomcat10使用
jakarta.servlet.*包,而Vaadin8依赖旧版javax.servlet.*,需确认兼容性包已适配Jakarta,或添加Tomcat的javax.servlet桥接包过渡。
二、Spring JMX UnableToRegisterMBeanException
- 检查Tomcat10的JMX配置:在
conf/catalina.properties中确认com.sun.management.jmxremote相关配置已启用,且端口未被占用。 - 调整Spring MBean注册策略:在Spring配置类添加
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING),避免重复注册已存在的MBean。 - 排查MBean命名冲突:检查自定义MBean的
ObjectName是否与Tomcat内置MBean重名,修改冲突的命名前缀。
三、内存泄漏警告(JDBC驱动/线程未停止)
- 修复JDBC驱动注销:在Spring的
DataSource销毁方法中显式调用DriverManager.deregisterDriver(),或改用Tomcat内置JNDI数据源,由容器统一管理生命周期。 - 清理残留线程:排查自定义线程池、定时任务,确保在Spring上下文销毁时调用
shutdown();生产环境禁用Vaadin DevMode,移除DevModeStartupListener相关配置。
四、监听器启动失败排查
- 查看Tomcat详细日志:在
logs/localhost.log或logs/catalina.out中定位监听器失败的具体堆栈,确认是Vaadin Spring监听器还是自定义Spring监听器出问题。 - 校验
web.xml配置:确保所有监听器类路径正确,Tomcat10下需使用jakarta.servlet包下的监听器类(替换旧版javax.servlet相关引用)。 - 分析依赖冲突:执行
mvn dependency:tree命令排查依赖树,排除重复或冲突的Spring、Vaadin依赖,重点解决javax.servlet与jakarta.servlet的混合依赖问题。
内容的提问来源于stack exchange,提问作者Ivan Karotki
相关产品推荐
相关产品推荐

