在几十个JAR文件中找到一个类?

问题

你如何在很多jar文件中找到特定的类名?

(寻找实际的类名,而不是引用它的类。)


#1 热门回答(325 赞)

#Unix

使用jar(或unzip -v),grepfind命令。

例如,以下将列出与给定名称匹配的所有类文件:

for i in *.jar; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done

如果你知道要搜索的整个Java归档列表,则可以使用(符号)链接将它们全部放在同一目录中。

或者使用find(区分大小写)查找包含给定类名的JAR文件:

find path/to/libs -name '*.jar' -exec grep -Hls ClassName {} \;

例如,要查找包含IdentityHashingStrategy的存档的名称:

$ find . -name "*.jar" -exec grep -Hsli IdentityHashingStrategy {} \;
./trove-3.0.3.jar

如果JAR可以在系统中,并且可以使用locate命令:

for i in $(locate "*.jar");
  do echo $i; jar -tvf $i | grep -Hsi ClassName;
done

#Windows

打开acommand prompt,切换到包含JAR文件的目录(或祖先目录),然后:

for /R %G in (*.jar) do @jar -tvf "%G" | find "ClassName" > NUL && echo %G

以下是它的工作原理:

  • for / R%G in(* .jar)do - 循环遍历所有JAR文件,递归遍历目录;将文件名存储在%G中。
  • @jar -tvf"%G"| - 运行Java Archive命令列出给定存档中的所有文件名,并将结果写入标准输出; @符号禁止打印命令的调用。
  • 找到"ClassName"> NUL - 从jar命令的输出中搜索标准输入,用于给定的类名;如果匹配则将ERRORLEVEL设置为1(否则为0)。
  • && echo%G - 如果ERRORLEVEL非零,则将Java归档文件名写入标准输出(控制台)。

#Web

使用asearch engine,扫描JAR files


#2 热门回答(53 赞)

前段时间,我为此编写了一个程序:https://github.com/javalite/jar-explorer


#3 热门回答(52 赞)

Eclipse可以做到这一点,只需创建一个(临时)项目并将库放在项目类路径上。然后你可以很容易地找到这些课程。

我想到的另一个工具是Java Decompiler。它可以同时打开很多罐子,也有助于找到课程。