做项目的时候遇到了很多次这个问题
java.lang.NoSuchMethodError:
如下
原因都是一样的
就是依赖包冲突了!!
之前的做法是不要乱添依赖
但是这是治标不治本的
后来借鉴了网上那些去依赖的博客
总结了一下
分享一下自己的方法
先简单的说一下包冲突是因为maven导入依赖包的时候,很多依赖包的子依赖包都会重合,然后maven本身有一套判断使用哪个子依赖包的方法,如果判断出来的依赖包不包含你当前所要使用的方法,那么就会报错了。
解决方法很简单,就是重复的依赖排除就行了
在pom用下面这个语句
<exclusions> <exclusion> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> </exclusion> </exclusions>
就可把重复的子依赖包排除掉
所以问题就是怎么知道应该排除什么包
在这里直接举例子吧
比如我在使用下面的依赖配置时
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming_2.11</artifactId> <version>2.3.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka_2.11</artifactId> <version>1.6.3</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <!----> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.4.4</version> </dependency>
程序执行到
val sparkConf = new SparkConf().setMaster("local[2]").setAppName("kafka-spark-demo")
报错
然后进行依赖包排查,只需要看第一句
java.lang.NoSuchMethodError: io.netty.buffer.PooledByteBufAllocator
聚焦到 io.netty 这个模块,意思就是这个模块应该是冲突了,想办法排除这个模块的子依赖
由于我用的idea是免费版,不支持图形化依赖树
因此用命令行生成
在该工程目录下(pom.xml所在目录)执行(我是MAC系统)
mvn dependency:tree -Dverbose> dependency.log
然后dependency.log中就有了依赖树的信息
打开查看(在这里我直接在idea中打开)
使用ctr+f查找io.netty的位置
在这里我们就找出io.netty属于哪个依赖包
(在这里要记住io.netty整个包的名字 io.netty:netty-all)
发现属于
org.apache.spark:spark-streaming_2.11
org.apache.hbase:hbase-server
在这里,因为之前只使用spark-streaming的时候那个语句没有问题,所以猜测应该是hase依赖包中的io.netty覆盖掉了spark-streaming的io.netty。所以我们只需要在hbase中把io.netty排除即可
因此pom改成
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming_2.11</artifactId> <version>2.3.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka_2.11</artifactId> <version>1.6.3</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <!----> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.4.4</version> <exclusions> <exclusion> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> </exclusion> </exclusions> </dependency>
通来说这么修改后应该可以了
但是我那时候还遇到的问题就是这么改之后,还是报一样的错
造成这种情况的因素有很多,但根本因素就是这个依赖其实并没有被去掉
那么应该怎么检查是否排除有效呢
我们打开
我们可以在这里点开每个包,看是否还在
确实还在
然后我重新输了一遍exclusions语句
再看一下
这时候终于不见了
然后我们再运行程序,可以正常运行!
自己在这问题上卡了好久,分享出来给大家~
当然,这类问题还有一种方法,就是什么冲突了就专门添加什么依赖包
所以在这里我们可以变成
<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.17.Final</version> </dependency> <!--https://mvnrepository.com/artifact/org.apache.spark/spark-streaming --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming_2.11</artifactId> <version>2.3.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka_2.11</artifactId> <version>1.6.3</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> <!----> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.4.4</version> </dependency>
在最前面添加了io.netty这个包,指导maven用这个
在这里也可解决我这个问题,当然这种方法不推荐
原博客:https://blog.csdn.net/m0_37637511/article/details/80364391