Caused by: java.lang.NoSuchMethodError:xxx——依赖冲突的解决

前因后果

1、背景

最近在给一个项目的配置迁移Apollo,遇到了一个问题,就是我引入了Apollo的相关依赖,但就是用不了,测试的时候就疯狂报错,最终原因是Caused by: java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch
在这里插入图片描述

2、处理过程

这个原因呢,一看就知道是依赖冲突的问题,我的是guava依赖的问题,就用了常用的方法排除依赖,但还是没得到解决。这可怎么办呢,依赖冲突一般就是因为依赖版本用的不是我们想用的,也就是方法调用的时候并没有用到我们想让它调用的,而是调用了其他依赖中的方法,emm~,想到一个方法,就是我们在报异常的前一步,看下它到底调用的那个依赖里边的,然后再想办法解决

3、解决方式

经过上边的处理,我知道了它调用的并不是我想用调用的依赖的版本,而是调用了hive中一个依赖中的guava依赖版本,这个版本依赖低,所以才会出现异常,我的处理方式是将我想调用的guava依赖提前在另一个总是调错依赖的hive依赖前边,问题得以解决(其实一般这种依赖冲突,直接采用排除的方式就好)下边我就详细介绍下如何处理依赖冲突了

依赖冲突的解决

一、问题

Caused by: java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;
在这里插入图片描述

二、解决方法:

1、命令查看依赖冲突

mvn dependency:tree -Dverbose

2、通过idea插件查看依赖冲突

(1)添加Maven Helper插件(File->Settings->Plugins,install Maven Helper)
在这里插入图片描述
(2)打开pom文件,点击Dependency Analyzer,选择Conflicts,从右边就可以看到依赖冲突
在这里插入图片描述
以上俩种方式,找到冲突的依赖,把不是要用的依赖在原来的依赖上排除就好

例如:

<dependency>
    <groupId>com.ctrip.framework.apollo</groupId>
    <artifactId>apollo-client</artifactId>
    <version>1.7.0</version>
    <exclusions>
        <exclusion>
            <artifactId>slf4j-api</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>

有时把看到的依赖都已经排除出去了,但还是有问题,此时就要用第三种方法了

3、查看我们调用的地方到底用的是哪个依赖里的

在你程序抛异常的那句话上面加上如下代码

以下三个之一就可以

(1)

System.out.println(this.getClass().getResource("/com/google/common/base/Stopwatch.class"));

(2)

java.security.ProtectionDomain pd = Stopwatch.class.getProtectionDomain();

CodeSource cs = pd.getCodeSource();

System.out.println(cs.getLocation());

(3)

ClassLoader cl = Stopwatch.class.getClassLoader();
System.out.println(cl.getResource(“com/google/common/base/Stopwatch.class”).getPath());

通过打印在运行过程中报异常的类到底是加载哪个依赖下的,就可以知道是不是用的我们想让它用的依赖的。此时处理掉这个不用的依赖就好了(也就是在由此依赖的依赖排除出去),或者调换依赖顺序,将我们真正用的依赖提到前边就可以了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值