这是一个简单粗暴的定位冲突jar的方法
项目中加了三个jar依赖之后 启动时就报错,去掉之后 运行正常
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>${hive.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-common</artifactId>
<version>${hive.version}</version>
</dependency>
判断是这个三个jar与 原有jar冲突
经过几轮尝试之后缩小范围 是 hive-jdbc 与hive-common 中的包存在冲突 与hadoop-common无关
尝试定位具体的冲突jar
1、根据具体错误百度 得到的很多都是配置文件写错 很显然不符合
2、因为项目依赖的包比较多 ,在加入上面三个包前就有30个jar冲突了 ,不过并没有影响项目正常运行,加入上面3个jar之后 多了10个冲突 ,首先把这多出来10个做exclusions排除 项目依然启不起来,把40个冲突的jar全部做排除 项目依然启不起来
以上尝试都没能定位到具体是哪个包冲突导致启动异常
突然想到一个办法:根据pom.xml全部排出,如果不报错 再定位具体的jar
点击
跳转进去查看所有依赖
把pom.xml中所有的依赖拷贝出来改成排除 贴到我项目中引用 hive-jdbc 的包中
同理hive-common 也根据pom.xml文件中依赖的包全都去掉
运行一下试试 果然正常了
然后就是在这些exclusion 中定位具体是哪一个了 范围已经确定剩下的就是使用二分法 一半一半的排除了
最终找到是这个包导致的冲突
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-all</artifactId>
改下依赖就OK了
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>${hive.version}</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-all</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-common</artifactId>
<version>${hive.version}</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty.aggregate</groupId>
<artifactId>jetty-all</artifactId>
</exclusion>
</exclusions>
</dependency>
不过我用这个命令 mvn -X compile dependency:tree -Dverbose >a.log打印所有冲突的jar并没有jetty-all 这个包冲突,所以我上面尝试定位的第二种方法 才没有找到真正的冲突jar