升级到 Spring Boot 3 后出现 NoClassDefFoundError jakarta/servlet/http/HttpSessionContext

问题描述 投票:0回答:3

在我的 gradle 基础项目中,我正在尝试将 spring 依赖项从 2.7.6 升级到 3.0.1,

但是我面临问题

NoClassDefFoundError: jakarta/servlet/http/HttpSessionContext

Caused by: java.lang.NoClassDefFoundError: jakarta/servlet/http/HttpSessionContext
    at org.eclipse.jetty.servlet.ServletContextHandler.newSessionHandler(ServletContextHandler.java:339)
    at org.eclipse.jetty.servlet.ServletContextHandler.getSessionHandler(ServletContextHandler.java:432)
    at org.eclipse.jetty.servlet.ServletContextHandler.relinkHandlers(ServletContextHandler.java:257)
    at org.eclipse.jetty.servlet.ServletContextHandler.<init>(ServletContextHandler.java:180)
    at org.eclipse.jetty.webapp.WebAppContext.<init>(WebAppContext.java:301)
    at org.eclipse.jetty.webapp.WebAppContext.<init>(WebAppContext.java:228)
    at org.springframework.boot.web.embedded.jetty.JettyEmbeddedWebAppContext.<init>(JettyEmbeddedWebAppContext.java:28)
    at org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory.getWebServer(JettyServletWebServerFactory.java:158)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161)
    ... 9 common frames omitted
Caused by: java.lang.ClassNotFoundException: jakarta.servlet.http.HttpSessionContext
    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)
    ... 19 common frames omitted

据我了解,Spring Boot 3.0 使用 Servlet Api 6.0,Jetty 不支持它,需要将 Servlet API 降级到 5.0.0 (https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide#jetty

java spring-boot gradle
3个回答
5
投票

要解决此问题,您需要添加到您的

gradle.build
脚本中
ext['jakarta-servlet.version'] = '5.0.0'


0
投票

我遇到了同样的问题,之前建议的选项并不适用于所有情况。要么服务启动,要么所有测试(包括mockmvc)都会成功。但不是一切。设置

5.0.0
6.0.0
只会使一部分工作......:-(

最终,这个设置对所有人都有效:

    ext {
        set("jakarta-servlet.version", '5.0.0')
    }

加:

    testImplementation 
            'org.eclipse.jetty:jetty-server:11.0.14',
            'jakarta.servlet:jakarta.servlet-api:6.0.0',

© www.soinside.com 2019 - 2024. All rights reserved.