Vaadin应用部署至Tomcat启动失败问题求助
问题分析与解决方法
第一个异常:NoSuchMethodError(WebApplicationContextUtils.getWebApplicationContext)
原因
- Vaadin 23.3.6依赖的Spring版本和你项目/Tomcat容器里的Spring版本不兼容,
WebApplicationContextUtils.getWebApplicationContext方法在高版本Spring中可能被移除或签名变更,Vaadin调用时找不到该方法。 - Tomcat 9.0.72官方仅支持Java 8到17,你使用的Java 18属于非官方支持版本,容易引发类加载或方法匹配的隐性问题。
解决方法
- 统一Spring版本:Vaadin 23.3.x适配Spring Boot 2.7.x,已降级到2.7.3的前提下,要确保所有Spring相关依赖都使用该版本,比如通过Maven的
dependencyManagement或Gradle的平台插件强制统一版本,避免依赖冲突。 - 降级Java到17:切换为Tomcat官方支持的Java 17 LTS版本,消除JDK版本不兼容带来的问题。
- 清理容器冲突依赖:检查Tomcat/lib目录,若存在Spring相关Jar包直接删除,防止和WAR包内的Spring依赖版本冲突(项目WAR应自带所需Spring依赖,除非是容器统一提供的依赖)。
第二个异常:Spring自动实例化DataSource失败(无合适驱动类)
原因
Spring Boot自动配置机制默认开启DataSourceAutoConfiguration,哪怕你不使用DataSource,只要classpath中存在JDBC相关依赖(比如Tomcat/lib里的MySQL驱动),Spring就会自动尝试配置数据源,但你未配置数据库连接参数,因此报错找不到合适驱动。
解决方法
- 禁用数据源自动配置:在Spring Boot启动类上添加
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}),直接关闭Spring的数据源自动配置逻辑。 - 清理项目JDBC依赖:检查项目的pom.xml或build.gradle,移除
spring-boot-starter-jdbc、spring-boot-starter-data-jpa这类未使用的JDBC相关依赖。 - 调整Tomcat驱动存放:如果项目完全不用数据源,就把Tomcat/lib里的MySQL驱动移走;要是其他应用需要保留该驱动,就必须采用第一种方法禁用自动配置。
内容的提问来源于stack exchange,提问作者Gary Greenberg
相关产品推荐
相关产品推荐

