我需要分析jar中不同的.class
文件使用(引用)了哪些类。我知道
jdeps -v example.jar
产生该输出。不幸的是,如果用户只有JDK1.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。还有其他类似的单字母修饰语我记不清了。
使用JD Java解压缩器(http://jd.benow.ca/)。
另一种解决方案是将JDK1.8放在可访问的网络驱动器上,并在那里调用jdeps
。即使在本地JDK为1.7的情况下,这也能正常工作。