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