做項目的時候遇到了很多次這個問題
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