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

Spark 3.3.2与Antlr 4.10.1兼容问题求助:ATN反序列化失败

问题描述

将遗留应用升级至Hibernate 6后,Hibernate 6依赖Antlr4 runtime 4.10.1,但应用同时依赖的Spark 3.3.2使用Antlr4 runtime 4.8,运行时出现如下反序列化错误:

Caused by: java.io.InvalidClassException: org.antlr.v4.runtime.atn.ATN; Could not deserialize ATN with version 3 (expected 4).
    at org.antlr.v4.runtime.atn.ATNDeserializer.deserialize(ATNDeserializer.java:56) ~[antlr4-runtime-4.10.1.jar:4.10.1]
    at org.antlr.v4.runtime.atn.ATNDeserializer.deserialize(ATNDeserializer.java:48) ~[antlr4-runtime-4.10.1.jar:4.10.1]
    at org.apache.spark.sql.catalyst.parser.SqlBaseLexer.<clinit>(SqlBaseLexer.java:1603) ~[spark-catalyst_2.13-3.3.2.jar:3.3.2]
    at org.apache.spark.sql.catalyst.parser.AbstractSqlParser.parse(ParseDriver.scala:107) ~[spark-catalyst_2.13-3.3.2.jar:3.3.2]

调试确认:Spark 3.3.2的SqlBaseLexer由Antlr4 4.8生成,在高版本Antlr4 runtime环境下运行会触发ATN版本不兼容问题,需解决Spark 3.3.2适配高版本Antlr4的问题。

可行解决方案
  • 类隔离(推荐):借助构建工具的类隔离机制,让Spark和Hibernate各自使用对应版本的Antlr4 runtime。
    • Maven可使用maven-shade-plugin,给Spark依赖的Antlr4 4.8重命名包路径,避免与Hibernate的4.10.1冲突;
    • Gradle可使用shadowJar插件,通过包重定位(relocate)处理Antlr4相关类。
  • 重新编译Spark Catalyst模块:下载Spark 3.3.2源码,用Antlr4 4.10.1重新生成SqlBaseLexer及相关解析类,编译后替换原有spark-catalyst包。注意需保持其他依赖版本兼容,避免引入新问题。
  • 降级Hibernate的Antlr4版本:若业务允许,尝试将Hibernate 6依赖的Antlr4 runtime降级至4.8(需确认Hibernate 6是否兼容4.8,部分功能可能受影响),通过统一版本避免冲突。
  • 升级Spark版本:将Spark升级至支持Antlr4 4.10+的版本(如Spark 3.4及以上,官方已升级Antlr4版本),从根源上解决版本不兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:27:27