通過shell腳本排查jar包中類沖突


當我們在線上運行項目時,依賴很多jar包,有時候某個類的全限定名,在多個包中出現,而某個包中的類的方法沒有,而且在類加載時,剛好加載了這個類,可能會報找不到方法,或者找不到類的異常,這種情況就可能是類沖突:

如:

java.lang.NoSuchMethodError: com.google.common.base.Objects.toStringHelper(Ljava/lang/Object;)Lcom/google/common/base/Objects$ToStringHelper;

這是可能就需要找一下到底是哪些依賴的jar包中包含了 :com.google.common.base.Objects 這個類,但是我們總不能一個個依賴jar包解壓去找吧,如果依賴比較多的話,會有好幾百個,不僅耗時耗力,還可能會中風,下面介紹一種使用shell腳本來檢索都是哪些jar包中包含了異常中找不到的類或方法,就以上述為列,我們找一下com.google.common.base.Objects這個類在哪些jar包中出現過,方便我們去除掉沖突:

find_class.sh

腳本命令:

#!/bin/sh

find_dir=$1
find_key=$2

jars=`find $find_dir -name '*.jar'`
for jar in $jars
do
    ret=`jar tvf $jar | grep $find_key`
    if [ "$?" = "0" ]; then
        echo -e "\e[1;34m${jar}\e[0m: \n\e[2;34m${ret}\e[0m"
    fi
done

wars=`find $find_dir -name '*.war'`
for war in $wars
do
    ret=`jar tvf $war | grep $find_key`
    if [ "$?" = "0" ]; then
        echo -e "\e[1;34m${war}\e[0m: \n\e[2;34m${ret}\e[0m"
    fi
done

使用方式:

./find_class.sh <dir_path> <class_name>

示例:找一下com.google.common.base.Objects這個類在哪些jar包中出現過

./find_class.sh lib/ com.google.common.base.Objects

 

 我們看到在guava-21.0.jar和hive-exec-1.2.0.jar中都出現了,且類全限定名相同,這是我們把不需要的jar包去除,依賴沖突就解決了


免責聲明!

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



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