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

Kap*_*psh 237 java jar class project-structure text-search

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

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

Dav*_*vis 387

Unix的

使用jar(或unzip -v)grep,和find命令.

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

for i in *.jar; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done
Run Code Online (Sandbox Code Playgroud)

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

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

find path/to/libs -name '*.jar' -exec grep -Hls ClassName {} \;
Run Code Online (Sandbox Code Playgroud)

例如,要查找包含IdentityHashingStrategy以下内容的存档的名称:

$ find . -name "*.jar" -exec grep -Hsli IdentityHashingStrategy {} \;
./trove-3.0.3.jar
Run Code Online (Sandbox Code Playgroud)

如果JAR可以在系统中的任何位置并且locate命令可用:

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

视窗

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

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

以下是它的工作原理:

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

卷筒纸

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

  • 是的-l会给你这个,但是当它从stdin获取输入时不是很有用. (3认同)
  • 微小的调整,找到具有定位的任何地方,以减少输出(对我非常有用,谢谢!!)-对于我在$(locate“ * .jar”); 做jar -tvf $ i | grep -Hsi ClassName &&回声$ i; 做完了 (2认同)

ipo*_*voy 59

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

  • 查找任何类型的文件,而不仅仅是类.双击以查看文件内容.是的,现在我可以发现我所有的春天模式. (4认同)

And*_*s_D 56

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

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

  • 并在Ctrl + Shift + T的帮助下 (20认同)

use*_*174 25

grep -l "classname" *.jar
Run Code Online (Sandbox Code Playgroud)

给你jar的名字

find . -name "*.jar" -exec jar -t -f {} \; | grep  "classname"
Run Code Online (Sandbox Code Playgroud)

为您提供课程的包装

  • 它应该是grep -lir"classname"*.jar (5认同)

Pas*_*ert 12

#!/bin/bash

pattern=$1
shift

for jar in $(find $* -type f -name "*.jar")
do
  match=`jar -tvf $jar | grep $pattern`
  if [ ! -z "$match" ]
  then
    echo "Found in: $jar"
    echo "$match"
  fi
done
Run Code Online (Sandbox Code Playgroud)


ILM*_*tan 8

当我遇到这个问题时,我不知道有什么实用工具,所以我写了以下内容:

public class Main {

    /**
     * 
     */
    private static String CLASS_FILE_TO_FIND =
            "class.to.find.Here";
    private static List<String> foundIn = new LinkedList<String>();

    /**
     * @param args the first argument is the path of the file to search in. The second may be the
     *        class file to find.
     */
    public static void main(String[] args) {
        if (!CLASS_FILE_TO_FIND.endsWith(".class")) {
            CLASS_FILE_TO_FIND = CLASS_FILE_TO_FIND.replace('.', '/') + ".class";
        }
        File start = new File(args[0]);
        if (args.length > 1) {
            CLASS_FILE_TO_FIND = args[1];
        }
        search(start);
        System.out.println("------RESULTS------");
        for (String s : foundIn) {
            System.out.println(s);
        }
    }

    private static void search(File start) {
        try {
            final FileFilter filter = new FileFilter() {

                public boolean accept(File pathname) {
                    return pathname.getName().endsWith(".jar") || pathname.isDirectory();
                }
            };
            for (File f : start.listFiles(filter)) {
                if (f.isDirectory()) {
                    search(f);
                } else {
                    searchJar(f);
                }
            }
        } catch (Exception e) {
            System.err.println("Error at: " + start.getPath() + " " + e.getMessage());
        }
    }

    private static void searchJar(File f) {
        try {
            System.out.println("Searching: " + f.getPath());
            JarFile jar = new JarFile(f);
            ZipEntry e = jar.getEntry(CLASS_FILE_TO_FIND);
            if (e == null) {
                e = jar.getJarEntry(CLASS_FILE_TO_FIND);
                if (e != null) {
                    foundIn.add(f.getPath());
                }
            } else {
                foundIn.add(f.getPath());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)


Geo*_*old 8

要找到与给定字符串匹配的jar:

find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;


小智 6

还有两个名为"JarScan"的不同实用程序,它们可以满足您的要求: JarScan(inetfeedback.com)JarScan(java.net)


Gun*_*ald 5

ClassFinder 是一个旨在解决此问题的程序。它允许您通过目录和 jar 文件递归搜索以查找与模式匹配的类的所有实例。它是用 Java 编写的,而不是 Python。它有一个很好的 GUI,使它易于使用。它运行得很快。此版本已在可运行的 jar 中预编译,因此您不必从源代码构建它。

在此处下载:ClassFinder 1.0