ClassNotFoundException、NoSuchMethodException?

背景/吐槽:公司的云平台架构部门提供了一个spark链接hbase的工具包,但是其中包含的依赖太多太多,对外提供的jar包一个包居然接近90M,然后引用进来之后问题就很容易一不小心就和本地自己依赖的jar包产生冲突,真的是坑嗷,由此也告诫自己以后自己如果对外提供服务jar包,一定要尽量去除不用的jar包,该设置scope为provided的设置provided,能shade的尽量学习flink官方jar包一样进行shade方式打包,尽量确保自己的jar中的依赖不对使用方造成影响。

解决办法:

Step1. 先看是哪个类提示未找到,然后找到这个类所属的jar包,如果确实是jar包不存在,则添加对应依赖,如果jar包存在,则说明应该是项目依赖多个版本的包导致的问题,如何找到哪些包依赖了这个包呢?

Step2. 我们项目的依赖是hadoop-common中的Configuration类报错的,查找发现jar包不存在,则直接加上对应依赖,继续执行发现还是提示ClassNotFoundException

Step3. 此时项目中确实只引入了这一个版本的hadoop-common包,如何判断项目中其它依赖的jar包是否有间接引入这个jar包呢?个人比较喜欢的方式是通过mvn dependency:tree >> dep.log的方式,在项目根目录下执行该命令把项目依赖分析全部写入到文本中,然后在文本中进行搜索对应依赖,判断有哪些jar包引入了对应类。

如上执行完毕后,发现确实只有我们这一个包的情况下还是提示异常,则想到大概率是flink官方jar包对hadoop版本有要求,这个时候去网上查也查不到,看flink对应jar包也没找到,不过还好我这边是拷贝的之前代码,之前项目代码运行是正常的,到这个新项目中运行异常,那么可以对之前项目执行mvn dependency:tree进行分析,看项目中对应引入的hadoop-common版本为2.8.2,而我们自己新项目中引入jar包的时候是随便引入的,引得jar包是3.1.0的,判断很有可能是版本过高,然后把版本设置为2.8.2后运行正常,由此运行应用成功~

下午一直被这个问题卡住好一会儿,之前只知道用IDEA自带的Diagrams->Show Dependecies,但是由于坑爹的公司提供的jar包依赖的包太多太多,加上自己项目的依赖,导致生成的依赖图完全无法看,依赖过多了生成的很慢,而且会有点卡,生成了之后密密麻麻的依赖根本看不清,即便设置完大小后也无法拖动,当然也可能是我使用方式不对? 经过这次排查,算是对maven此类问题有种豁然开朗的感觉,下次再遇到此类问题排查思路算是有了哈~ 妈妈再也不用担心我的各种依赖冲突了~~

你可能感兴趣的:(Java,Java,Maven)