当前位置: 首页 > backend >正文

SparkUI依赖问题解决方法

错误原因分析

你收到的错误是:

Exception in thread "main" java.lang.NoClassDefFoundError: org/glassfish/jersey/servlet/ServletContainerat org.apache.spark.status.api.v1.ApiRootResource$.getServletHandler(ApiRootResource.scala:63)
...
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

这个错误表明:

  1. Spark UI 的某些部分(特别是 ApiRootResource,用于提供 REST API)依赖于 Jersey 这个 JAX-RS (Java API for RESTful Web Services) 的实现。
  2. org.glassfish.jersey.servlet.ServletContainer 是 Jersey 提供的一个 Servlet 实现,用于将 Jersey 的 RESTful 功能集成到 Servlet 容器中。
  3. NoClassDefFoundError 表示在运行时,JVM 在你的类路径中找不到这个 ServletContainer 类。

核心问题:你的类路径中缺少了 Jersey Servlet 相关的依赖。

回顾你的 classpath:

我没有看到 org/glassfish/jersey/containers/jersey-container-servlet 或 jersey-container-servlet-core 等类似的 JAR 包。

你只有这些 Jersey 核心依赖:

  • org/glassfish/jersey/core/jersey-client/3.1.10
  • org/glassfish/jersey/core/jersey-common/3.1.10
  • org/glassfish/jersey/inject/jersey-hk2/3.1.10

这些是 Jersey 的客户端、通用模块和依赖注入模块,但它们不包含 Servlet 集成所需的 ServletContainerServletContainer 通常位于像 jersey-container-servletjersey-container-servlet-core 这样的模块中。

Spark UI 作为一个 Web 应用,需要一个 HTTP 服务器(它用的是 Jetty)以及 Servlet API 的实现,同时也需要一个 RESTful 框架来暴露其监控 API。Spark UI 选择的 RESTful 框架就是 Jersey。


解决方案

解决这个问题就是将 Spark UI 所需的 Jersey Servlet 集成模块添加到你的 Maven 依赖中

方案一:添加 Jersey Servlet Container 依赖 (最直接)

你需要添加 jersey-container-servlet 依赖。

具体操作(在你的 pom.xml 中添加 Maven 依赖):

在你的 pom.xml 文件的 <dependencies> 部分,添加以下依赖:

XML

<dependency><groupId>org.glassfish.jersey.containers</groupId><artifactId>jersey-container-servlet</artifactId><version>3.1.10</version> <scope>compile</scope> </dependency>

原因分析:

  • 你的日志显示 org.glassfish.jersey.core/jersey-client/3.1.10 等,所以 3.1.10 应该是一个兼容的版本。
  • jersey-container-servlet 模块包含了将 Jersey 应用程序部署到 Servlet 容器(如 Jetty)所需的类,包括 ServletContainer

步骤:

  1. 打开你的 Maven 项目的 pom.xml 文件。

  2. <dependencies> 标签内部添加上述 jersey-container-servlet 的依赖。

  3. 重新确认你的 jakarta.servlet-api 版本

    :鉴于你之前解决了

    SingleThreadModel
    

    问题,你现在应该使用的是

    jakarta.servlet-api:5.0.0
    

    。请

    确保这个版本依然是 5.0.0

    ,不要又跳回

    6.0.0
    

    ,因为那样会重新引入

    SingleThreadModel
    

    的问题。

    XML

    <dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>5.0.0</version><scope>provided</scope>
    </dependency>
    
  4. 保存 pom.xml 文件。

  5. 在 IntelliJ IDEA 中,点击 Maven 侧边栏的 Reload All Maven Projects 按钮(一个刷新图标),或者右键点击 pom.xml -> Maven -> Reload project

  6. 执行 Maven 清理与重建

    • 在终端中进入你的项目根目录,运行:

      Bash 猛击

      mvn clean
      mvn install -DskipTests
      

    这能确保所有依赖都被正确刷新和重新打包。

  7. 重新运行你的 Spark 程序。


额外提示

  • 依赖树检查: 如果添加 jersey-container-servlet 后仍然出现问题,或者出现新的 NoClassDefFoundError,务必运行 mvn dependency:tree > dependency_tree.txt。仔细检查 dependency_tree.txt 文件,搜索 servletjakartajersey 相关的依赖,查找是否有隐藏的冲突或版本不匹配。
  • SLF4J 警告: 你的日志中仍然有 SLF4J 的警告。虽然不影响程序运行,但建议在所有问题解决后,通过 Maven <exclusions> 统一日志提供者,只保留 Logback 或 Log4j2 的一个绑定。

你已经快成功了!这个错误明确指出了缺失的 Jersey 组件,添加它应该能解决问题。祝你成功!

http://www.xdnf.cn/news/14243.html

相关文章:

  • React 性能优化实战指南:从理论到实践的完整攻略
  • Linux--磁盘寻址:从 CHS 到 LBA 的深度解码之旅
  • 深度解析Java泛型:从原理到实战应用
  • 大模型在颈椎管狭窄诊疗中的应用研究报告
  • MySQL 调优笔记
  • 嵌入式系统内核镜像相关(五)
  • 33-Oracle Parallel 并行处理的选择和实践
  • 【论文阅读34】Attention-ResNet-LSTM(JRMGE2024)
  • 移动开发中边框1px的问题
  • AJAX——前后端传输数据场景下使用的技术
  • java设计模式[2]之创建型模式
  • 【无标题】【2025年软考中级】第三章数据结构3.2 栈与队列
  • 【0.0 漫画C语言计算机基础 - 从二进制开始认识计算机】
  • 纯 CSS 实现的的3种扫光效果
  • 记录lxml中的etree、xpath来定位、爬取元素
  • 清理 Docker 容器日志文件方法
  • YOLOv3 训练与推理流程详解-结合真实的数据样例进行模拟
  • 19.vue.js的style的lang=scss、less(2)
  • 荒原之梦:致力于考研数学实战
  • 大模型——Dify 与 Browser-use 结合使用
  • Spring AI Alibaba Graph 实践
  • 简历模板2——数据挖掘工程师5年经验
  • DataX Hive写插件深度解析:从数据写入到Hive表关联实战
  • 【Flutter】Widget、Element和Render的关系-Flutter三棵树
  • 写出优秀的 Git 提交信息:一份详尽指南(Angular 风格)
  • CS144 lab0: warmup
  • 嵌入式 STM32 开发问题:烧录 STM32CubeMX 创建的 Keil 程序没有反应
  • Flutter动画与交互:打造流畅用户体验的完整指南
  • 基于GNU Radio Companion搭建的AM信号实验
  • 项目拓展-Apache对象池,对象池思想结合ThreadLocal复用日志对象