ANTLR版本不匹配致ATN反序列化失败问题排查与解决
ANTLR版本冲突(4.9.3 vs 4.10.1)导致
Could not deserialize ATN异常的原因与解决办法 问题原因
- 依赖传递的隐式覆盖:Spark SQL 3.5.0的POM虽声明使用ANTLR 4.9.3,但Spark的其他子模块或间接依赖(如第三方组件)可能引入了
antlr4-runtime:4.10.1,Maven的依赖调解机制会选择路径更近或声明顺序更优的版本,最终导致运行时使用高版本ANTLR运行库,而Spark SQL编译时用4.9.3工具生成的代码与运行库版本不匹配,引发ATN反序列化异常。 - Quarkus BOM的版本统一干预:Quarkus的物料清单(BOM)会统一管理大量依赖版本,若Quarkus BOM中指定
antlr4-runtime为4.10.1,会强制覆盖Spark SQL声明的版本,造成冲突。
解决办法
1. 锁定ANTLR运行时版本为4.9.3
在项目pom.xml中通过<dependencyManagement>强制锁定版本,确保所有依赖使用Spark SQL预期的4.9.3:
<dependencyManagement> <dependencies> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> <version>4.9.3</version> <scope>compile</scope> </dependency> </dependencies> </dependencyManagement>
再在<dependencies>块中显式引入该依赖,强化优先级:
<dependencies> <!-- 其他业务依赖 --> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> <version>4.9.3</version> </dependency> </dependencies>
2. 排除冲突的ANTLR依赖
通过IntelliJ依赖分析工具定位到引入antlr4-runtime:4.10.1的根源依赖,在对应依赖声明中排除冲突:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.13</artifactId> <version>3.5.0</version> <exclusions> <exclusion> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> </exclusion> </exclusions> </dependency>
排除后手动引入4.9.3版本的antlr4-runtime即可。
3. 覆盖Quarkus BOM的ANTLR版本
若Quarkus BOM是版本冲突源头,在<dependencyManagement>中覆盖版本(优先级高于Quarkus BOM声明):
<dependencyManagement> <!-- 先引入Quarkus BOM --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-bom</artifactId> <version>3.2.10.Final</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 覆盖ANTLR版本 --> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> <version>4.9.3</version> </dependency> </dependencyManagement>
验证操作
修改完成后执行以下命令,确认依赖版本统一为4.9.3:
mvn dependency:tree | grep antlr4-runtime
确认版本无误后重新运行应用即可解决异常。
内容的提问来源于stack exchange,提问作者PowerfullDeveloper
相关产品推荐
相关产品推荐

