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