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
相关产品推荐
相关产品推荐

