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

Spring Boot 3.2.5升级后加载javax.servlet.Filter失败求助

问题描述

将基于Java 8的Spring Boot 2.7.12应用升级至Spring Boot 3.2.5 + Java 17后,启动时出现如下错误:

[12-09-2024 12:06:52.402] [] [main] [WARN ] [o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext.refresh] - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: I/O failure while processing configuration class [org.commonsources.correlation.filter.CorrelationHeaderFilter]
[12-09-2024 12:06:52.405] [] [main] [INFO ] [o.s.b.a.l.ConditionEvaluationReportLogger.logMessage] - 

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
[12-09-2024 12:06:52.414] [] [main] [ERROR] [o.s.boot.SpringApplication.reportFailure] - Application run failed
org.springframework.beans.factory.BeanDefinitionStoreException: I/O failure while processing configuration class [org.commonsources.correlation.filter.CorrelationHeaderFilter]
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:251)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:189)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:314)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:246)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:197)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:165)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:416)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:788)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:606)
    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 org.springframework.boot.SpringApplication.run(SpringApplication.java:1343)
    at com.myproject.ecommerce.emc.EmcApplication.main(EmcApplication.java:19)
Caused by: java.io.IOException: Failed to load class [javax.servlet.Filter]
    at org.springframework.context.annotation.ConfigurationClassParser.asSourceClass(ConfigurationClassParser.java:627)
    at org.springframework.context.annotation.ConfigurationClassParser$SourceClass.getInterfaces(ConfigurationClassParser.java:956)
    at org.springframework.context.annotation.ConfigurationClassParser.processInterfaces(ConfigurationClassParser.java:396)
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:342)
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:246)
    ... 18 common frames omitted
Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:467)
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:304)
    at org.springframework.context.annotation.ConfigurationClassParser.asSourceClass(ConfigurationClassParser.java:624)

已将原有的JMS依赖从:

implementation group: 'javax.jms', name: 'javax.jms-api', version: '2.0.1'

替换为Jakarta版本:

implementation group: 'jakarta.jms', name: 'jakarta.jms-api', version: '3.1.0'

但问题仍未解决,完整的build.gradle如下:

buildscript {
    ext {
        springBootVersion = '3.2.5'
    }

    repositories {
        maven {
            url "http://repourl.com:8081/repository/maven-proxy-group/"
            allowInsecureProtocol = true
        }
    }

    dependencies {
        classpath "gradle.plugin.com.sourcemuse.gradle.plugin:GradleMongoPlugin:1.0.7"
        classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.8"
        //classpath "net.ltgt.gradle:gradle-apt-plugin:0.20"
        classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.sonarqube'
apply plugin: "com.sourcemuse.mongo"
apply plugin: 'jacoco'

group = 'com.test.abc'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 17

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    maven {
        url "http://repourl.com:8081/repository/maven-proxy-group/"
        allowInsecureProtocol = true
    }
}

jacocoTestReport {
    reports {
        xml.enabled false
        csv.enabled false
        html.destination file("/jacoco/code-coverage")
    }
}

jar {
    enabled = false
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-aop'
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
    implementation 'org.springframework.boot:spring-boot-starter-data-rest'
    implementation (group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa')
    //implementation group: 'org.springframework', name: 'spring-jms', version: '6.1.6'

    implementation 'org.springframework.kafka:spring-kafka'
    implementation(group: 'org.springframework', name: 'spring-jms')
    implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.7.0'
    implementation group: 'org.springdoc', name: 'springdoc-openapi-webmvc-core', version: '1.7.0'
    implementation 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'

    // External Dependencies
    implementation files('lib/ojdbc8.jar')
    implementation 'org.commonsources:correlation:1.0.7.RELEASE'

    annotationProcessor group: 'org.mapstruct', name: 'mapstruct-processor', version: '1.3.0.Final'
    implementation "org.mapstruct:mapstruct:1.3.0.Final"

    implementation group: 'org.yaml', name: 'snakeyaml', version: '2.0'

    implementation 'io.micrometer:micrometer-registry-prometheus'
    implementation 'io.micrometer:micrometer-core'
    implementation 'com.github.ozlerhakan:poiji:3.0.0'
    implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-csv', version: '2.14.1'

    //implementation group: 'javax.jms', name: 'javax.jms-api', version: '2.0.1'

    implementation group: 'jakarta.jms', name: 'jakarta.jms-api', version: '3.1.0'

    implementation group: 'xerces', name: 'xercesImpl', version: '2.12.2'
    implementation 'com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.0'
    implementation group: 'org.mongodb', name: 'mongodb-driver-sync', version: '4.7.2'
    implementation group: 'org.mongodb', name: 'mongodb-driver-core', version: '4.7.2'
    implementation group: 'org.mongodb', name: 'mongodb-driver-reactivestreams', version: '4.7.2'
    implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-csv', version: '2.14.1'
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.14.1'
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.14.1'
    implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.14.1'
    implementation group: 'org.dom4j', name: 'dom4j', version: '2.1.3'
    implementation group: 'com.google.guava', name: 'guava', version: '31.1-jre'
    //  implementation "ch.qos.logback:logback-classic:1.4.5"
    //  implementation "ch.qos.logback:logback-core:1.4.5"
    implementation 'org.apache.kafka:kafka-clients:7.3.3-ce'
    implementation group: 'org.apache.commons', name: 'commons-compress', version: '1.23.0'
    implementation group: 'org.xerial.snappy', name: 'snappy-java', version: '1.1.10.2'

    //Test Dependencies
    //  testImplementation group: 'de.flapdoodle.embed', name: 'de.flapdoodle.embed.mongo'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'io.projectreactor:reactor-test'
    //testImplementation group: 'com.h2database', name: 'h2', version: '2.1.214'
    testImplementation 'junit:junit:4.13.2'
}

task integrationTest(type: Test) {
    runWithMongoDb = true
}
解决方案

错误根源是org.commonsources.correlation:1.0.7.RELEASE依赖内部引用了javax.servlet.Filter,而Spring Boot 3.x已完全切换到Jakarta EE API(jakarta.servlet.*),不再包含javax.servlet相关类。

方案1:升级第三方依赖到兼容Jakarta的版本

检查org.commonsources:correlation是否有支持Jakarta的新版本,若有直接替换:

implementation 'org.commonsources:correlation:[兼容Jakarta的版本号]'

方案2:添加Jakarta Servlet API依赖

如果暂时无法升级第三方依赖,直接引入Jakarta Servlet API,同时确保项目包含Spring Boot Web Starter(它会自动管理版本):

// 优先添加Web Starter,自动包含Jakarta Servlet API
implementation 'org.springframework.boot:spring-boot-starter-web'

// 若无需Web Starter,可单独引入
implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0'

方案3:排除第三方依赖中的javax.servlet传递依赖

如果第三方依赖携带了javax.servlet的传递依赖,在gradle中排除它:

implementation('org.commonsources:correlation:1.0.7.RELEASE') {
    exclude group: 'javax.servlet', module: 'javax.servlet-api'
}

排除后必须确保项目已引入jakarta.servlet:jakarta.servlet-api或spring-boot-starter-web。

额外检查点

  • 自定义Filter、Servlet等组件需从javax.servlet包切换到jakarta.servlet包,例如将import javax.servlet.Filter;改为import jakarta.servlet.Filter;
  • 排查其他依赖是否仍引用javax.* API,所有相关依赖都需替换为对应的Jakarta版本。

内容的提问来源于stack exchange,提问作者coredev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:15:54