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此類問題有種豁然開朗的感覺,下次再遇到此類問題排查思路算是有了哈~ 媽媽再也不用擔心我的各種依賴衝突了~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章