Spring Boot 2.3.7→3.2.2迁移后应用启动失败求助
问题
我们使用Spring Boot嵌入式Tomcat服务器,因依赖项目众多,未采用逐步升级方式,而是直接从2.3.7.RELEASE版本迁移至3.2.2版本,同步完成了Java 11到Java 21的版本升级。目前代码可正常编译且单元测试全部通过,但执行bootRun命令启动应用时失败,报错信息如下:
org.springframework.context.ApplicationContextException: Unable to start web server at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:165) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:618) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) at com.lv.gi.journeyengine.JourneyEngineInitializer.initialise(JourneyEngineInitializer.java:24) at com.lv.gi.showcase.ShowcaseApplication.main(ShowcaseApplication.java:13) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tomcatServletWebServerFactory' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryConfiguration$EmbeddedTomcat.class]: Error creating bean with name 'nettyWebServerFactoryCustomizer' defined in class path resource [org/springframework/boot/autoconfigure/web/embedded/EmbeddedWebServerFactoryCustomizerAutoConfiguration$NettyWebServerFactoryCustomizerConfiguration.class]: Post-processing of merged bean definition failed at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:606) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tomcatServletWebServerFactory' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryConfiguration$EmbeddedTomcat.class]: Error creating bean with name 'nettyWebServerFactoryCustomizer' defined in class path resource [org/springframework/boot/autoconfigure/web/embedded/EmbeddedWebServerFactoryCustomizerAutoConfiguration$NettyWebServerFactoryCustomizerConfiguration.class]: Post-processing of merged bean definition failed at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getWebServerFactory(ServletWebServerApplicationContext.java:223) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:186) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162) ... 8 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nettyWebServerFactoryCustomizer' defined in class path resource [org/springframework/boot/autoconfigure/web/embedded/EmbeddedWebServerFactoryCustomizerAutoConfiguration$NettyWebServerFactoryCustomizerConfiguration.class]: Post-processing of merged bean definition failed Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'nettyWebServerFactoryCustomizer' defined in class path resource [org/springframework/boot/autoconfigure/web/embedded/EmbeddedWebServerFactoryCustomizerAutoConfiguration$NettyWebServerFactoryCustomizerConfiguration.class]: Post-processing of merged bean definition failed at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:576) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:665) at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.getWebServerFactoryCustomizerBeans(WebServerFactoryCustomizerBeanPostProcessor.java:87) at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.getCustomizers(WebServerFactoryCustomizerBeanPostProcessor.java:78) at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.postProcessBeforeInitialization(WebServerFactoryCustomizerBeanPostProcessor.java:70) at org.springframework.boot.web.server.WebServerFactoryCustomizerBeanPostProcessor.postProcessBeforeInitialization(WebServerFactoryCustomizerBeanPostProcessor.java:58) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:421) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1765) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599) ... 16 common frames omitted Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.boot.autoconfigure.web.embedded.NettyWebServerFactoryCustomizer] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@70dea4e] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:483) Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.boot.autoconfigure.web.embedded.NettyWebServerFactoryCustomizer] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@70dea4e] at org.springframework.util.ReflectionUtils.doWithLocalMethods(ReflectionUtils.java:320) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.buildLifecycleMetadata(InitDestroyAnnotationBeanPostProcessor.java:297) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.findLifecycleMetadata(InitDestroyAnnotationBeanPostProcessor.java:274) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.findLifecycleMetadata(InitDestroyAnnotationBeanPostProcessor.java:203) at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(InitDestroyAnnotationBeanPostProcessor.java:182) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition(CommonAnnotationBeanPostProcessor.java:311) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors(AbstractAutowireCapableBeanFactory.java:1084) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573) ... 29 common frames omitted Caused by: java.lang.NoClassDefFoundError: reactor/netty/http/Http2SettingsSpec$Builder at java.base/java.lang.Class.getDeclaredMethods0(Native Method) at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3578) at java.base/java.lang.Class.getDeclaredMethods(Class.java:2676) at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:465) Caused by: java.lang.NoClassDefFoundError: reactor/netty/http/Http2SettingsSpec$Builder ... 37 common frames omitted Caused by: java.lang.ClassNotFoundException: reactor.netty.http.Http2SettingsSpec$Builder at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) Caused by: java.lang.ClassNotFoundException: reactor.netty.http.Http2SettingsSpec$Builder at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ... 41 common frames omitted
当前已尝试排除ReactorAutoConfiguration和NettyAutoConfiguration,但问题未得到解决。以下是项目的Gradle依赖配置:
dependencies { implementation (group: 'org.springframework.boot', name: 'spring-boot-autoconfigure', version: "${springBootVersion}") implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: "${springBootVersion}" implementation group: 'org.springframework.boot', name: 'spring-boot-starter-cache', version: "${springBootVersion}" implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: "${springBootVersion}" implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation', version: "${springBootVersion}" implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: "${springBootVersion}" implementation group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: "${springBootVersion}" implementation group: 'org.springframework.data', name: 'spring-data-commons', version: "${springBootVersion}" implementation group: 'org.springframework.data', name: 'spring-data-redis', version: "${springBootVersion}" implementation group: 'org.springframework.data', name: 'spring-data-keyvalue', version: "${springBootVersion}" implementation group: 'org.springframework.session', name: 'spring-session-data-redis', version:"3.2.1" implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5' implementation group: 'commons-beanutils', name: 'commons-beanutils', version: '1.9.3' implementation group: 'org.apache.commons', name: 'commons-text', version: '1.8' implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.10.1' implementation "com.lv.gi:jwt-openidconnect-lib:$jwtOpenIdConnectVersion" implementation group: 'com.azure.spring', name: 'azure-spring-boot', version: '3.1.0' implementation 'com.azure:azure-security-keyvault-keys:4.2.0' implementation 'com.azure:azure-identity:1.0.9' implementation group: 'com.microsoft.azure', name: 'applicationinsights-logging-logback', version: '2.6.+' implementation group: 'com.microsoft.azure', name: 'azure-keyvault-secrets-spring-boot-starter', version: '2.3.5' implementation group: "com.lv.gi.journeyframework", name: "journey-engine-core", version: "2.1.0.+" implementation group: 'com.lv.gi.journeyframework', name: 'traps-common', version: '2.1.0.+' implementation (group : 'org.yaml', name: 'snakeyaml', version: '1.28' implementation (group: 'com.nimbusds', name: 'nimbus-jose-jwt', version: '8.19') implementation('it.ozimov:embedded-redis:0.7.2') implementation group: 'org.json', name: 'json', version: '20201115' implementation "org.mapstruct:mapstruct-jdk8:${mapStructVersion}" annotationProcessor "org.mapstruct:mapstruct-processor:${mapStructVersion}" compileOnly "org.projectlombok:lombok:$lombokVersion" annotationProcessor "org.projectlombok:lombok:$lombokVersion" }
解决方案
问题根源
报错最终指向reactor.netty.http.Http2SettingsSpec$Builder类缺失,同时Spring Boot尝试初始化Netty的Web服务器工厂定制器,但你实际使用的是Tomcat作为嵌入式服务器,核心矛盾是:Netty相关自动配置被触发,但依赖缺失或版本不兼容。
1. 彻底禁用Netty自动配置
修改启动类注解,直接排除Netty相关的自动配置类:
@SpringBootApplication(exclude = { NettyAutoConfiguration.class, EmbeddedWebServerFactoryCustomizerAutoConfiguration.NettyWebServerFactoryCustomizerConfiguration.class })
2. 排除依赖中的Netty模块
检查所有引入Netty的依赖,显式排除Reactor Netty,比如spring-boot-starter-data-redis可能间接引入:
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: "${springBootVersion}" { exclude group: 'io.projectreactor.netty', module: 'reactor-netty' }
3. 修复依赖配置问题
- 删除重复依赖:移除配置中重复的
spring-boot-starter-actuator依赖项; - 修正语法错误:
snakeyaml的依赖声明缺少闭合括号,改为:implementation (group : 'org.yaml', name: 'snakeyaml', version: '1.28') - 升级不兼容的第三方依赖:Azure相关依赖版本(如
3.1.0、2.3.5)与Spring Boot 3.2.2不兼容,建议升级到Azure Spring Boot 4.11.x系列(适配Spring Boot 3.2.x)。
4. 强制统一依赖版本(可选)
如果项目必须保留部分Netty依赖,强制使用Spring Boot 3.2.2兼容的Reactor Netty版本(1.1.12):
configurations.all { resolutionStrategy.force 'io.projectreactor.netty:reactor-netty:1.1.12' }
5. 清理并重新构建
执行Gradle命令清理缓存并重新下载依赖:
./gradlew clean build --refresh-dependencies
完成以上步骤后重新启动应用,即可解决启动失败问题。
内容的提问来源于stack exchange,提问作者Ant
相关产品推荐
相关产品推荐

