一、背景
项目中需要查找目录下所有jar
的.class
的import 类型,以排查java.lang.NoClassDefFoundError
。因为如果使用反射加载类时候,java不会打印具体是哪个jar的哪个类加载其他类出现问题。
二、思路
(1)反编译jar,生成.java文件,准备使用procyon-decompiler
,其支持命令行操作,github下载地址procyon,其GUI工具是Luyten,win&mac均有客户端。支持java8,更新版本请看官方文档。
(2)使用shell的grep命令查找.java文件的文本呢内容,如查找 import org.apache.hadoop.hive.ql.metadata.Hive;
三、实战
本例使用的linux环境是centos7,java8
实际速度是很慢的,比如反编译spark/jars目录需要1个多小时,grep速度很快,几秒即可。
3.1 下载jar包
procyon 下载最新版即可。拷贝至linux环境
3.2 编写脚本
# 创建
decompile-jar.sh
# 编写脚本
vi decompile-jar.sh
修改下:/**/procyon-decompiler/procyon-decompiler-0.6.0.jar
就可以了。
#!/bin/bash
counter=1
input_dir=`dirname $1/.`
output_dir=`dirname $2/.`
if [ -z $input_dir ]; then
echo