Hibernate 6与Apache Spark 3.5.0兼容性问题:Antlr4版本冲突
解决Spark 3.5.0与Hibernate 6.2.1.Final的Antlr4版本冲突问题
你遇到的异常是因为Spark 3.5.0依赖的Antlr4 4.9生成的ATN(增强转移网络)序列化版本为3,而Hibernate 6.2.1依赖的Antlr4 4.10要求的序列化版本为4,两者不兼容导致反序列化失败。以下是两种可行的解决方法:
方法1:统一Antlr4版本为兼容的高版本
Antlr4的4.10+版本向下兼容大部分4.9的语法逻辑,我们可以强制整个项目使用Antlr4 4.10.1版本,同时排除Spark依赖中自带的低版本Antlr4。
具体Maven配置
- 首先在
dependencyManagement中锁定Antlr4版本:
<dependencyManagement> <dependencies> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> <version>4.10.1</version> </dependency> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4</artifactId> <version>4.10.1</version> </dependency> </dependencies> </dependencyManagement>
- 修改Spark的依赖配置,排除其中的Antlr4依赖:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.5.0</version> <exclusions> <exclusion> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> </exclusion> <exclusion> <groupId>org.antlr</groupId> <artifactId>antlr4</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.5.0</version> <exclusions> <exclusion> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> </exclusion> <exclusion> <groupId>org.antlr</groupId> <artifactId>antlr4</artifactId> </exclusion> </exclusions> </dependency>
- 保留原有的Hibernate依赖配置即可。
方法2:检查依赖树并针对性排除
如果方法1出现兼容性问题,先通过Maven命令查看项目的依赖树,确认低版本Antlr4的来源:
mvn dependency:tree | grep antlr
根据输出结果,除了Spark之外,如果还有其他依赖引入Antlr4 4.9,同样对其进行排除操作,确保最终项目依赖的Antlr4版本为4.10.x。
验证
修改配置后,执行mvn clean package重新构建项目,启动应用后检查是否还出现Could not deserialize ATN with version 3 (expected 4)的异常。
内容的提问来源于stack exchange,提问作者Praval Sharma
相关产品推荐
相关产品推荐

