You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 22:10:56