我需要分析.class
jar 中的不同文件使用(引用)了哪些类。我知道
jdeps -v example.jar
产生这个输出。不幸的是,如果用户只有 JDK 1.7,我需要一个可行的解决方案。这怎么可能实现?
我已经能够使用javap -c
正则表达式过滤器获得看似不错的结果。
我曾经cygwin
得到我的结果,但是你应该可以在任何环境下做到这一点,你只需要一个解压缩javap
工具,一个执行正则表达式的工具。在当前的 Windows 版本中,powershell
将提供这些功能。
以下代码将列出 jar 文件中每个类引用的类:
mkdir workDir
unzip yourJar.jar -d workDir
shopt -s globstar
for classFile in **/*.class; do
echo "Classes used in $classFile :"
javap -c "$classFile" | grep -Eo "([a-zA-Z0-9]+/)+[A-Z][a-zA-Z0-9]*" | sort -u
echo
done
你说你想要在jar
文件中引用的类,所以假设你不想要每个类的细节,这应该起作用:
mkdir workDir
unzip yourJar.jar -d workDir
shopt -s globstar
for classFile in **/*.class; do
javap -c "$classFile" | grep -Eo "([a-zA-Z0-9]+/)+[A-Z][a-zA-Z0-9]*"
done | sort -u
请注意,这将错过不遵循约定的类,例如在默认包中定义的类或名称不以大写字母开头的类。
您还将检索限定名称以L
: 开头的类,这表示数组,如果您只关心类名,您可能希望去掉该 L。还有其他类似的单字母修饰符我不记得了。
另一种解决方案是将 JDK1.8 放在可访问的网络驱动器上并jdeps
在那里调用。即使本地 JDK 为 1.7,这也有效。
使用 JD Java 反编译器 ( http://jd.benow.ca/ )。