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

直接依赖与间接依赖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:40:23