當我們在線上運行項目時,依賴很多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包去除,依賴沖突就解決了