1

我需要分析.classjar 中的不同文件使用(引用)了哪些类。我知道

jdeps -v example.jar

产生这个输出。不幸的是,如果用户只有 JDK 1.7,我需要一个可行的解决方案。这怎么可能实现?

4

3 回答 3

2

我已经能够使用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。还有其他类似的单字母修饰符我不记得了。

于 2017-02-10T13:48:27.663 回答
1

另一种解决方案是将 JDK1.8 放在可访问的网络驱动器上并jdeps在那里调用。即使本地 JDK 为 1.7,这也有效。

于 2017-02-13T13:36:34.210 回答
1

使用 JD Java 反编译器 ( http://jd.benow.ca/ )。

于 2017-02-10T12:26:07.873 回答