直接依赖与间接依赖ANTLR4版本不匹配问题求解
解决tomlj 1.0.0与ANTLR4 4.13.1的版本冲突问题(无需降级ANTLR)
方案1:排除tomlj中的ANTLR依赖
直接在Maven依赖中排除tomlj自带的ANTLR相关依赖,强制项目使用你指定的4.13.1版本。修改后的依赖配置如下:
<dependency> <groupId>org.tomlj</groupId> <artifactId>tomlj</artifactId> <version>1.0.0</version> <exclusions> <!-- 排除tomlj依赖的ANTLR运行时和工具包 --> <exclusion> <groupId>org.antlr</groupId> <artifactId>antlr4-runtime</artifactId> </exclusion> <exclusion> <groupId>org.antlr</groupId> <artifactId>antlr4</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4</artifactId> <version>4.13.1</version> </dependency>
注意:ANTLR新版本通常对旧版本生成的解析器有较好向后兼容性,修改后务必测试tomlj核心功能(如TOML文件解析、序列化)是否正常。如果出现解析异常,再考虑其他方案。
方案2:升级tomlj到兼容更高版本ANTLR的新版本
tomlj的后续版本(如2.x系列)已升级依赖的ANTLR版本,比如tomlj 2.0.0及以上依赖ANTLR4 4.11.1,与4.13.1兼容性更好。修改依赖为最新兼容版本(以2.0.1为例):
<dependency> <groupId>org.tomlj</groupId> <artifactId>tomlj</artifactId> <version>2.0.1</version> </dependency> <dependency> <groupId>org.antlr</groupId> <artifactId>antlr4</artifactId> <version>4.13.1</version> </dependency>
这个方案更稳妥,官方维护的版本会处理依赖兼容性问题,优先推荐尝试。
方案3:类隔离(通过Shade插件隔离tomlj的ANTLR依赖)
如果前两个方案不适用,可通过maven-shade-plugin将tomlj及其依赖的ANTLR4 4.7.2进行类隔离,重命名包名避免冲突。在pom.xml中添加插件配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <!-- 将tomlj依赖的ANTLR类重命名到独立包下 --> <relocations> <relocation> <pattern>org.antlr</pattern> <shadedPattern>shaded.org.antlr.tomlj</shadedPattern> </relocation> </relocations> <!-- 指定需要隔离的artifact --> <artifactSet> <includes> <include>org.tomlj:tomlj</include> <include>org.antlr:antlr4-runtime</include> <include>org.antlr:antlr4</include> </includes> </artifactSet> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn package后,生成的jar包会包含重命名后的ANTLR类,tomlj使用这些隔离类,项目其他部分继续使用4.13.1版本的ANTLR。
内容的提问来源于stack exchange,提问作者fluter
相关产品推荐
相关产品推荐

