Maven工程報錯java.lang.NoSuchMethodError:


做項目的時候遇到了很多次這個問題

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM