【问题标题】:How to resolve nested exception is java.lang.NoClassDefFoundError: org/eclipse/jetty/server/session/SessionDataStore?如何解决嵌套异常是 java.lang.NoClassDefFoundError: org/eclipse/jetty/server/session/SessionDataStore?
【发布时间】:2021-06-12 22:00:11
【问题描述】:

我正在迁移一个旧的多模块项目。我无法迁移,因为它有很多依赖项,所以我进行了一次迁移,希望它会更容易。

我将 Spring-boot 升级到 2.4.3 版本并不断收到这些错误:

引起:org.springframework.context.ApplicationContextException: 无法启动网络服务器;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名称为 'JettyServletWebServerFactory' 的 bean 类路径资源 [org/springframework/boot/autoconfigure/web/servlet/ServletWebServerFactoryConfiguration$EmbeddedJetty.class]: 通过工厂方法实例化 Bean 失败;嵌套异常是 org.springframework.beans.BeanInstantiationException:失败 实例化 [org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory]: 工厂方法“JettyServletWebServerFactory”抛出异常;嵌套的 例外是 java.lang.NoClassDefFoundError: org/eclipse/jetty/server/session/SessionDataStore 在 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162)

我的码头版本是 9.2.28.v20190418。

我正在努力解决这个问题,但没有取得任何进展。

我该如何解决?

更新:

我尝试将 Spring Boot 降级到 2.3.3.RELEASE,我尝试将所有码头组件升级到 11.0.1,没有区别。它变得不太清晰,更边缘的错误消息。

更新 2:

当我启动 Spring Boot 应用程序本身时,我收到一条消息:

说明:

试图调用一个不存在的方法。尝试是从以下位置进行的:

org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory.configureSession(JettyServletWebServerFactory.java:242)

以下方法不存在:

'void org.eclipse.jetty.server.session.SessionHandler.setMaxInactiveInterval(int)'

该方法的类 org.eclipse.jetty.server.session.SessionHandler 可从以下位置获得:

jar:file:/Users/dmytro/.m2/repository/org/eclipse/jetty/jetty-server/9.2.28.v20190418/jetty-server-9.2.28.v20190418.jar!/org/eclipse/jetty/server/session/SessionHandler.class

我仍然无法理解如何解决它,因为我之前没有过多地使用Jetty,但它看起来有点像。

更新 3:

经过无数小时的调试,我发现wiremock:2.27.2spring-boot:2.4.3 之间出现了冲突。它们都依赖于不兼容的jettyjetty:9.2.28.v20190418jetty:9.4.38.v20210224 版本。

问题是我无法移除wiremock。我不能降级 Spring Boot,因为wiremock 是滞后的。我还有什么其他选择?

更新 4: 我发布了issue on GitHub。我希望不需要修补wiremock或重写测试代码库。

【问题讨论】:

    标签: java spring spring-boot jetty wiremock


    【解决方案1】:

    在 Jetty Github 问题上,我得到了一个答案,解决了我使用jetty-bom 的问题,所以jetty 可以自行处理:

        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-bom</artifactId>
            <type>pom</type>
        </dependency>
    

    它对我来说无缝工作。

    更新:

    在我完成 mvn clean install 之前,它可以无缝运行,所以在我的情况下,另一个绝对必要的依赖项:

    <dependency>
      <groupId>com.github.tomakehurst</groupId>
      <artifactId>wiremock-jre8</artifactId>
      <version>2.27.2</version>
      <type>pom</type>
    </dependency>
    

    【讨论】:

      【解决方案2】:

      Spring Boot 2.4.3 基于 Jetty 9.4.38.v20210224。 NoClassDefFoundException 中报告的类 SessionDataStore 不存在于您正在使用的 Jetty 版本中。

      因此,解决方案可能是升级到 Jetty 9.4.38.v20210224。

      【讨论】:

      • 我需要排除特定的码头库吗?它们有一组东西,例如 servlet、核心、服务器、客户端等等。
      • 我认为,您应该从org.springframework.boot:spring-boot-dependencies:2.4.3 导入依赖管理或尝试使用与项目中定义的相同版本。所以,我不认为,你必须排除某些东西。
      • 我更新了我的帖子。由于 Wiremock 和不兼容的 jetty 版本,看起来一切都搞砸了。您还有其他想法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 2015-09-10
      • 1970-01-01
      相关资源
      最近更新 更多