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

Spark 3.4.1与Jakarta Servlet 6.0.0在Spring Boot 3中的兼容性问题

解决Spring Boot 3 + Spark Session的Jersey Servlet兼容性问题

核心问题根源

Spring Boot 3 基于 Jakarta EE 9+ 规范,所有 Servlet 相关 API 包名从 javax.servlet 迁移到了 jakarta.servlet;而你当前使用的 Spark 版本依赖的是基于 javax.servlet 的旧版 Jersey,直接引入 Jakarta Servlet 或共存两套 API 会导致类加载冲突和类型不匹配。


解决方案1:升级Spark到Jakarta兼容版本

Spark 3.4.0 及以上版本开始全面支持 Jakarta EE 规范,依赖的 Jersey 也切换到了 Jakarta 版本。直接升级Spark版本即可解决冲突:

<!-- Maven示例:Spark SQL依赖 -->
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.12</artifactId>
    <version>3.4.0</version>
    <!-- 根据部署场景调整scope:本地运行可去掉provided,集群部署保留 -->
    <scope>provided</scope>
</dependency>

升级后无需额外处理Servlet依赖,Spark会自动引入适配Jakarta的Jersey组件。


解决方案2:强制替换Spark的Jersey依赖(无法升级Spark时)

如果无法升级Spark,需要手动排除Spark依赖中基于javax.servlet的旧Jersey,替换为Jakarta版本的Jersey组件:

<!-- Spark核心依赖,排除旧版Jersey和javax.servlet -->
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.12</artifactId>
    <version>你的Spark版本</version>
    <exclusions>
        <exclusion>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-servlet</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-server</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 引入Jakarta版本的Jersey Servlet -->
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-jakarta</artifactId>
    <version>3.1.4</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>3.1.4</version>
</dependency>

注意:Jersey 3.x 对应 Jakarta EE 9+,所有Jersey组件版本需保持一致,避免版本冲突。


解决方案3:类加载隔离(极端场景)

如果上述方法仍无法解决,可通过类加载隔离避免Spring Boot和Spark的API冲突:

在创建SparkSession时,开启驱动端优先加载用户类路径:

SparkSession spark = SparkSession.builder()
    .appName("SpringBootSparkDemo")
    .master("local[*]")
    .config("spark.driver.userClassPathFirst", true)
    .getOrCreate();

该配置让Spark优先使用项目中的类依赖,避免和自带的旧版javax组件冲突。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:05:22