Spring Boot 3+Jetty启动报错:java.lang.ClassNotFoundException: jakarta.servlet.http.HttpSessionContext
解决Spring Boot 3搭配Jetty启动时
jakarta.servlet.http.HttpSessionContext找不到的问题 问题原因
jakarta.servlet.http.HttpSessionContext在Jakarta Servlet 5.0(Spring Boot 3默认使用的版本)中已被移除,Jetty 11+版本基于Jakarta Servlet 5.0开发,本身不会依赖该类。出现此错误的核心原因是项目存在依赖冲突,引入了旧版本的Servlet API(如javax.servlet的旧版依赖、Jakarta Servlet 4.x及以下版本),导致Jetty启动时尝试加载已废弃的类。
解决步骤
1. 排查依赖冲突
运行Gradle命令查看Servlet API相关依赖树,定位冲突来源:
./gradlew dependencyInsight --dependency jakarta.servlet-api
或查看完整依赖树:
./gradlew dependencies
重点检查是否存在javax.servlet:javax.servlet-api或javax.servlet:servlet-api这类旧版依赖。
2. 全局排除旧版Servlet依赖
在Gradle配置中添加全局排除规则,避免旧版依赖被引入:
configurations { compileOnly { extendsFrom annotationProcessor } all { exclude group: 'javax.servlet', module: 'javax.servlet-api' exclude group: 'javax.servlet', module: 'servlet-api' } }
3. 统一Jetty版本(可选)
虽然Spring Boot的依赖管理已默认适配Jetty版本,但可显式指定兼容的Jetty版本(Spring Boot 3.0.x对应Jetty 11.0.14+),确保版本一致性:
dependencyManagement { dependencies { dependency 'org.eclipse.jetty:jetty-server:11.0.15' dependency 'org.eclipse.jetty:jetty-webapp:11.0.15' dependency 'org.eclipse.jetty:jetty-servlet:11.0.15' } }
修改后的完整Gradle配置
plugins { id 'java' id 'idea' id 'org.springframework.boot' version '3.0.1' id 'io.spring.dependency-management' version '1.1.0' } idea { module { downloadJavadoc = false downloadSources = false } } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } all { exclude group: 'javax.servlet', module: 'javax.servlet-api' exclude group: 'javax.servlet', module: 'servlet-api' } } repositories { mavenCentral() } dependencyManagement { dependencies { dependency 'org.eclipse.jetty:jetty-server:11.0.15' dependency 'org.eclipse.jetty:jetty-webapp:11.0.15' dependency 'org.eclipse.jetty:jetty-servlet:11.0.15' } } dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-jetty' implementation('org.springframework.boot:spring-boot-starter-web') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' } compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }
验证操作
执行以下命令清理并重新构建项目,然后启动应用:
./gradlew clean build ./gradlew bootRun
内容的提问来源于stack exchange,提问作者red
相关产品推荐
相关产品推荐

