jar包冲突分析及解决

jar包冲突原因

我们知道maven有传递性依赖机制,举例来说,当我们需要A的依赖的时候,就会在pom.xml中引入A的jar包;而A的jar包中依赖了B的jar包,这样Maven在解析pom.xml的时候,会依次将A、B 的jar包全部都引入进来。

这样就会造成一个问题:

A->B->C->G21(guava 21.0)
E->F->G20(guava 20.0)
假设pom.xml 文件中引入A与E两个依赖,按照上述的传递性依赖机制,与默认的依赖调解机制(第一:路径最近者优先;第二:第一声明优先),默认引用的是G20版本的jar包,G21的jar包不会被引用。
如果C的methodC使用了新版本G21才拥有的新类/新方法,程序中调用了C对应G21的新类/新方法时,因为项目中引用的是G20,所以JVM去加载Class时就会发现G20没有这个类,就会抛出ClassNotFoundException;同样,调用G20没有的新方法时会抛出NoSuchMethodError。

排查jar包冲突

一般来说,使用IDEA插件是一个简便的排查方法

  1. 下载Maven Helper

  2. 打开pom.xml

  3. 点击Dependency Analyzer 窗口一目了然
    在这里插入图片描述
    通过Maven命名行的方式也是也不错的选择:

  4. 通过 mvn dependency:tree 可以在控制台上打印出依赖

  5. 通过 mvn dependency:tree -Dverbose -Dincludes=groupId:artifactId 只打印出你关心的Jar包的依赖关系

  6. 通过标签手动排除依赖
    例如

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>error_prone_annotations</artifactId>
            <groupId>com.google.errorprone</groupId>
        </exclusion>
    </exclusions>
</dependency>

在引用guava时将com.google.errorprone这个包排除掉。

当然也有一些其他方法,对我来说第一种已经满足日常使用了。

如何避免jar包冲突

最重要的还是要主动避免jar包冲突的情况,在父pom文件中利用 ,对依赖Jar包进行统一版本管理,一劳永逸。通常的做法是,在parent模块的pom文件中尽可能地声明所有相关依赖Jar包的版本,并在子pom中简单引用该构件即可。

例如在父pom文件中定义lombok的版本:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
        </dependency>
    </dependencies>
</dependencyManagement>

然后在子moudle中:

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

子moudle中自动会引用版本为1.18.10的lombok Jar包

原文链接:https://www.cnblogs.com/keeya/p/12093640.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值