Jar包问题查找脚本

简介: Jar包问题查找脚本

20200222154703829.jpg


一、查找jar包类名关键字


脚本功能


此脚本在Jar包中的包名和类名中查找某一关键字,并高亮显示匹配的Jar包名称和路径,


解决问题

多用于定位java.lang.NoClassDefFoundErrorjava.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/


命令效果


20200222153439218.png


二、在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


命令效果

20200222153854719.png

三、检查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 ./


命令效果


20200222154207107.png

20200222154235578.png

本文脚本已上传CSDN,需要的可以自己去下载哈~地址为:jar包问题排查脚本.zip-Java代码类资源-CSDN下载

目录
相关文章
|
4月前
|
Java
[JarEditor]可直接修改jar包的IDEA插件
### 修改JAR包变得更简单:JarEditor插件简介 **背景:** 开发中常需修改JAR包中的class文件,传统方法耗时费力。JarEditor插件让你一键编辑JAR包内文件,无需解压。 **插件使用:** 1. **安装:** 在IDEA插件市场搜索JarEditor并安装。 2. **修改class:** 打开JAR文件中的class,直接编辑,保存后一键构建更新JAR。 3. **文件管理:** 右键菜单支持在JAR内新增/删除/重命名文件等操作。 4. **搜索:** 使用内置搜索功能快速定位JAR包内的字符串。
455 2
[JarEditor]可直接修改jar包的IDEA插件
|
4月前
|
弹性计算 Java Serverless
Serverless 应用引擎操作报错合集之上传自定义JAR包,启动时报错,是什么导致的
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
4月前
|
关系型数据库 Java 分布式数据库
PolarDB产品使用问题之部署到服务器上的Java应用(以jar包形式运行)无法连接,如何解决
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
3月前
|
Java Shell
Java Sprintboot jar 项目启动、停止脚本
Java Sprintboot jar 项目启动、停止脚本
36 0
|
4月前
|
监控 Ubuntu Java
如何在Ubuntu上运行Jar包?
【7月更文挑战第9天】
225 0
如何在Ubuntu上运行Jar包?
|
4月前
|
Java 应用服务中间件
tomcat7 与 tomcat8 加载 jar包的顺序
tomcat7 与 tomcat8 加载 jar包的顺序
162 0
|
4月前
|
Java 应用服务中间件 API
java 启动查看jar包加载顺序并设置classpath
java 启动查看jar包加载顺序并设置classpath
368 0
|
4月前
|
缓存 Java Maven
IntelliJ IDEA中无法加载jar包导致出现“cannot resolve symbol...”问题的解决
IntelliJ IDEA中无法加载jar包导致出现“cannot resolve symbol...”问题的解决
168 0
|
5月前
|
Java Shell Maven
使用Nexus上传JAR包的两种方法
使用Nexus上传JAR包的两种方法
3308 0