如何在不使用SpringBoot的前提下将Vaadin 8迁移到搭载嵌入式Tomcat的Vaadin 20
Vaadin 20 无SpringBoot集成嵌入式Tomcat实现方案
Vaadin Flow 本身原生兼容标准Servlet容器,不存在SpringBoot强依赖,仅Fusion模块的默认适配逻辑偏向Spring生态,手动做少量配置即可实现非Spring场景的集成,具体步骤如下:
1. pom.xml 依赖与插件配置
首先调整依赖配置,排除Vaadin默认引入的Spring相关传递依赖,引入必需组件:
- 核心依赖:
vaadin-core(包含Flow和Fusion核心包)、javax.servlet-api:4.0.1(适配Tomcat 9的Servlet规范)、嵌入式Tomcat组件tomcat-embed-core、tomcat-embed-jasper、tomcat-embed-websocket(满足Vaadin推送功能的WebSocket要求) - 排除所有
vaadin-spring、spring-boot-starter相关的传递依赖,避免Spring包冲突
然后调整vaadin-maven-plugin配置:将前端资源输出目录outputDirectory指定为你静态Tomcat实例挂载的资源目录,比如src/main/webapp/VAADIN,开发/生产模式参数和后续Servlet初始化参数保持一致即可,无需用插件单独启动前端服务,构建后资源会直接打入Tomcat可识别的静态路径。
注意:Vaadin 20 仅支持基于Java EE的Tomcat 9版本,不要使用升级到Jakarta EE的Tomcat 10+,否则会出现类名不匹配的启动错误。
2. 嵌入式Tomcat实例配置
你原有双Tomcat实例的启动逻辑不需要大改,仅需在挂载动态上下文的实例中手动注册Vaadin相关Servlet:
- 注册
com.vaadin.flow.server.VaadinServlet,映射路径设为/* - 配置Servlet初始化参数:
productionMode:开发模式设为false,生产环境设为true,和插件配置保持一致compatibilityMode:Vaadin 20默认关闭,无需额外配置
- 挂载静态资源的Tomcat实例直接沿用原有逻辑,把构建生成的
VAADIN目录作为静态资源子目录挂载即可。
3. Fusion模块非Spring场景适配
Fusion的@Endpoint注解默认依赖Spring自动注册,手动注册对应Servlet即可正常使用:
- 引入
fusion-core依赖,排除Spring相关传递依赖 - 注册
com.vaadin.fusion.server.EndpointServlet,映射路径设为/connect/*(Fusion默认的前后端接口调用前缀) - 手动实现
EndpointRegistry接口,将所有加了@Endpoint注解的类实例注册到Registry中,Fusion仅要求提供Endpoint实例的获取逻辑,没有强绑定Spring IOC容器。
是否迁移到SpringBoot的建议
如果项目没有过重的历史代码包袱,非常推荐同步迁移到SpringBoot:
- Vaadin官方现在的新特性迭代、文档示例、问题修复都优先适配SpringBoot生态,Fusion的权限注解
@AnonymousAllowed、@PreAuthorize等开箱即用的能力,手动适配需要编写大量额外代码,迁移到SpringBoot可以减少至少一半的配置工作量 - 原有双Tomcat实例的架构逻辑在SpringBoot下完全可以实现,你可以启动两个独立的
SpringApplication实例,分别配置不同的端口和上下文路径,和原有架构不会产生冲突,迁移成本远低于自行适配Fusion的非Spring场景。
如果项目遗留代码较多、改动风险高,也可以先按上述非Spring方案完成适配,后续再逐步迭代迁移。
内容的提问来源于stack exchange,提问作者Helmer Barcos
相关产品推荐
相关产品推荐

