一、查找jar包类名关键字
脚本功能
此脚本在Jar包中的包名和类名中查找某一关键字,并高亮显示匹配的Jar包名称和路径,
解决问题
多用于定位java.lang.NoClassDefFoundError
和java.lang.ClassNotFoundException
的问题,以及类版本重复或者冲突的问题等。
脚本代码
#!/bin/bash ### 查找jar包中的字段,多用于定位java.lang.NoClassDefFoundError和java.lang.ClassNotFoundException的问题,以及类版本重复或者冲突的问题等。 find . -name "*.jar" > /tmp/find_in_jar_temp while read line do if unzip -l $line | grep $1 &> /tmp/find_in_jar_temp_second then echo $line | sed 's#\(.*\)#\x1b[1;31m\1\x1b[00m#' cat /tmp/find_in_jar_temp_second fi done < /tmp/find_in_jar_temp
命令格式
1. find-jar-field 关键字或者类名 路径 2. 例如 3. ./find-jar-field TaskQueue ./lib/
命令效果
二、在jar包中查找指定字段
脚本功能
这个脚本在Jar包中进行二进制内容查找指定的字段
解决问题
经常可以解决一些很神奇的问题,例如某些功能上线没有生效、某些日志没有打印,上了新功能却没有展示,就可以通过这个命令查找打的包是否有问题。
脚本代码
#!/bin/bash ### 查找路径下jar包包含的字段 if [ $# -lt 2 ];then echo 'Usage : jargrep text path' exit 1; fi LOOK_FOR=$1 LOOK_FOR=`echo ${LOOK_FOR//\./\/}` folder=$2 echo "find '$LOOK_FOR' in $folder " for i in `find $2 -name "*jar"` do unzip -p $i | grep "$LOOK_FOR" > /dev/null if [ $? = 0 ] then echo "==> Found \"$LOOK_FOR\" in $i" fi done
命令格式
1. grep-jar 关键字或者类名 路径 2. 例如 3. ./grep-jar TaskQue ./lib
命令效果
三、检查jar包冲突脚本
脚本功能
此脚本用于识别冲突的Jar包,可以在一个根目录下找到所有包含相同类的Jar包,并且根据相同类的多少来判断Jar包的相似度。
解决问题
常常用于某些功能上线不可用或者没有按照预期起到作用,使用此脚本分析是否存在两个版本的类,而老版本的类被Java虚拟机加载,其实,JVM规范并没有规定类路径下相同类的加载顺序,实现JVM规范的虚拟机的实现机制也各不相同,因此无法判断相同的类中哪个版本的类会被先加载,因此Jar包冲突是个非常讨厌的问题。
脚本代码
#!/bin/bash ### 脚本用于识别冲突的Jar包,可以在一个根目录下找到所有包含相同类的Jar包 if [ $# -eq 0 ];then echo "please enter classpath dir" exit -1 fi if [ ! -d "$1" ]; then echo "not a directory" exit -2 fi tmpfile="/tmp/.cp$(date +%s)" tmphash="/tmp/.hash$(date +%s)" verbose="/tmp/cp-verbose.log" declare -a files=(`find "$1" -name "*.jar"`) for ((i=0; i < ${#files[@]}; i++)); do jarName=`basename ${files[$i]}` list=`unzip -l ${files[$i]} | awk -v fn=$jarName '/\.class$/{print $NF,fn}'` size=`echo "$list" | wc -l` echo $jarName $size >> $tmphash echo "$list" done | sort | awk 'NF{ a[$1]++;m[$1]=m[$1]","$2}END{for(i in a) if(a[i] > 1) print i,substr(m[i],2) }' > $tmpfile awk '{print $2}' $tmpfile | awk -F',' '{i=1;for(;i<=NF;i++) for(j=i+1;j<=NF;j++) print $i,$j}' | sort | uniq -c | sort -nrk1 | while read line; do dup=${line%% *} jars=${line#* } jar1=${jars% *} jar2=${jars#* } len_jar1=`grep -F "$jar1" $tmphash | grep ^"$jar1" | awk '{print $2}'` len_jar2=`grep -F "$jar2" $tmphash | grep ^"$jar2" | awk '{print $2}'` # Modified by Robert 2017.4.9 #len=$(($len_jar1 > $len_jar2 ? $len_jar1 : $len_jar2)) len_jar1=`echo $len_jar1 | awk -F' ' '{print $1}'` len_jar2=`echo $len_jar2 | awk -F' ' '{print $1}'` if [ $len_jar1 -gt $len_jar2 ] then len=$len_jar1 else len=$len_jar2 fi per=$(echo "scale=2; $dup/$len" | bc -l) echo ${per/./} $dup $jar1 $jar2 done | sort -nr -k1 -k2 | awk 'NR==1{print "Similarity DuplicateClasses File1 File2"}{print "%"$0}'| column -t sort $tmpfile | awk '{print $1,"\n\t\t",$2}' > $verbose echo "See $verbose for more details." rm -f $tmpfile rm -f $tmphash
命令格式
1. ./jar-conflict-detect 关键字或者类名 路径 2. 例如 3. ./jar-conflict-detect ./
命令效果
本文脚本已上传CSDN,需要的可以自己去下载哈~地址为:jar包问题排查脚本.zip-Java代码类资源-CSDN下载