當咱們在線上運行項目時,依賴不少jar包,有時候某個類的全限定名,在多個包中出現,而某個包中的類的方法沒有,並且在類加載時,恰好加載了這個類,可能會報找不到方法,或者找不到類的異常,這種狀況就多是類衝突:java
如:shell
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包中出現過,方便咱們去除掉衝突:google
find_class.shspa
腳本命令:code
#!/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
使用方式:blog
./find_class.sh <dir_path> <class_name>
示例:找一下com.google.common.base.Objects這個類在哪些jar包中出現過token
./find_class.sh lib/ com.google.common.base.Objects
咱們看到在guava-21.0.jar和hive-exec-1.2.0.jar中都出現了,且類全限定名相同,這是咱們把不須要的jar包去除,依賴衝突就解決了class