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

Maven依赖管理疑问:排除B1引入B2后Jar A将使用哪个依赖?

问题解答

核心结论

当你在项目中排除Jar A声明的B1(commons-lang3),并显式引入B2(commons-lang)后,Jar A会使用你引入的B2。因为Maven依赖解析时,Jar A的B1依赖被排除,项目类路径中只有你添加的B2,类加载器会从B2中加载Jar A代码里导入的类。

方法找不到错误的原因

commons-lang和commons-lang3是Apache的两个独立库,二者的类结构、方法签名存在显著差异:

  • 包路径不同:commons-lang的类在org.apache.commons.lang包下,commons-lang3的类在org.apache.commons.lang3包下
  • 即使类名相同(比如StringUtils),内部方法也可能不兼容,甚至某些方法在不同版本中被移除或修改

Jar A的代码实际依赖commons-lang的类,但你引入的B2版本可能和Jar A预期的不一致,导致调用的方法在当前B2版本中不存在,从而触发NoSuchMethodError。

解决方案

  • 确认Jar A依赖的B2版本:反编译Jar A的目标类,查看导入的commons-lang类的完整包名,以及调用的具体方法,确定所需的commons-lang准确版本。
  • 正确配置依赖:在项目POM中排除Jar A的B1依赖,同时引入对应版本的B2:
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>jar-a</artifactId>
        <version>x.y.z</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version> <!-- 替换为Jar A实际需要的版本 -->
    </dependency>
    
  • 验证依赖树:执行mvn dependency:tree命令,检查输出结果,确保commons-lang3已被排除,且commons-lang的版本正确,无其他冲突版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:22:10