在数十个JAR文件中的某个地方找到一个类?Unix窗户蹼

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

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


答案 1

Unix

在 Linux 上,其他 Unix 变体,Windows 上的 Git Bash 或 Cygwin,都使用 (or )、和命令。jarunzip -vgrepfind

下面列出了与给定名称匹配的所有类文件:

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

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

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

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

语法变体:

find path/to/libs -name '*.jar' -print | \
  while read i; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done 

窗户

打开命令提示符,切换到包含 JAR 文件的目录(或祖先目录),然后:

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

以下是它的工作原理:

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

使用扫描 JAR 文件的搜索引擎


答案 2

Eclipse可以做到这一点,只需创建一个(临时)项目并将你的库放在项目类路径上。然后,您可以轻松找到这些类。

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