在数十个JAR文件中的某个地方找到课程?


249

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

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


1
我不知道这些答案中的任何一个,但是如果您看到一个包含大量JAR文件的工作项目中使用的类,则对我有用的是将光标放在该类名上,右键单击它,然后单击“打开声明”( F3);那么它应该在新标签的顶部列出JAR文件。
安德鲁

Answers:


59

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

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


22
并借助Ctrl + Shift + T
KrishPrabakar

408

Unix系统

在Linux,其它Unix系统,混帐击在Windows或Cygwin的,使用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

语法变体:

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 Archive命令以列出给定档案中的所有文件名,并将结果写入标准输出;该@符号禁止打印命令的调用。
  3. find "ClassName" > NUL-从jar命令的输出中通过管道输入标准输入,以查找给定的类名;ERRORLEVEL如果存在匹配项,则将其设置为1(否则为0)。
  4. && echo %G-如果ERRORLEVEL非零,则将Java归档文件名写入标准输出(控制台)。

网页

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


3
是的-l会为您提供,但是从stdin获取输入时不是很有用。
乔治·阿姆霍尔德


27
grep -l "classname" *.jar

给你罐子的名字

find . -name "*.jar" -exec jar -t -f {} \; | grep  "classname"

给你这个班的套餐


5
应该是grep -lir“ classname” * .jar
Leonard Saers 2013年

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

太好了!我必须在没有jar的系统上使用它(也就是说,不在路径中),因此我将其替换jar -tvfunzip -l
ixe013 2013年


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();
        }
    }

}


4

user1207523的脚本对我来说很好。这是一个变体,它使用find而不是简单的扩展方式来搜索jar文件。

#!/bin/bash
for i in `find . -name '*.jar'`; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done

4

我一直在Windows上使用过它,并且效果非常好。

findstr /s /m /c:"package/classname" *.jar, where

findstr.exe是Windows和params的标准配置:

  • / s =递归
  • / m =如果匹配则仅打印文件名
  • / c =文字字符串(在这种情况下,您的软件包名称+类名称以'/'分隔)

希望这对某人有帮助。


3

使用的bash script解决方案unzip (zipinfo)。经过测试Ubuntu 12

#!/bin/bash

# ./jarwalker.sh "/a/Starting/Path" "aClassName"

IFS=$'\n'
jars=( $( find -P "$1" -type f -name "*.jar" ) )

for jar in ${jars[*]}
    do
        classes=( $( zipinfo -1 ${jar} | awk -F '/' '{print $NF}' | grep .class | awk -F '.' '{print $1}' ) )
        if [ ${#classes[*]} -ge 0 ]; then
            for class in ${classes[*]}
                do
                    if [ ${class} == "$2" ]; then
                        echo "Found in ${jar}"
                    fi
                done
        fi
    done

此脚本与mingw不兼容
kisp 2013年

2

要在给定目录中的所有jar文件中搜索特定的类,可以执行以下操作:

ls *.jar | xargs grep -F MyClass

或者,甚至更简单

grep -F MyClass *.jar

输出看起来像这样:

Binary file foo.jar matches

这是非常快的,因为-F选项意味着搜索固定字符串,因此它不会为每次grep调用加载正则表达式引擎。如果需要,您始终可以忽略-F选项并使用正则表达式。


2

我发现了这种新方法

bash $ ls -1  | xargs -i -t jar -tvf '{}'| grep Abstract
jar -tvf activation-1.1.jar
jar -tvf antisamy-1.4.3.jar
  2263 Thu Jan 13 21:38:10 IST 2011 org/owasp/validator/html/scan/AbstractAntiSamyScanner.class
...

因此,这列出了jar和类(如果找到的话),如果需要,您可以给ls -1 * .jar或使用查找命令HTH Someone输入到xargs。


谢谢,我这样改进:ls -1 * .jar | xargs -i -t jar -tvf'{}'| grep的摘要
杰罗姆乙

2

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

在此处下载:ClassFinder 1.0





1

查找jar文件的脚本:find_jar.sh

IFS=$(echo -en "\n\b") # Set the field separator newline

for f in `find ${1} -iname *.jar`; do
  jar -tf ${f}| grep --color $2
  if [ $? == 0 ]; then
    echo -n "Match found: "
    echo -e "${f}\n"
  fi
done
unset IFS

用法:./find_jar.sh <包含jar文件的顶级目录> <要查找的类名>

这类似于此处给出的大多数答案。但是,如果grep发现某些内容,它只会输出文件名。如果要抑制grep输出,可以将其重定向到/ dev / null,但是我也希望看到grep的输出,以便可以使用部分类名并从显示的输出列表中找出正确的类名。

类名称可以是简单的类名称(例如“ String”),也可以是完全限定的名称(例如“ java.lang.String”)。


1

添加另一个工具...这是一个非常简单实用的Windows工具。单击一个简单的exe文件,为其提供要搜索的目录,类名称,它将找到包含该类的jar文件。是的,它是递归的。

http://sourceforge.net/projects/jarfinder/


1

要在文件夹(和子文件夹)一堆JAR中查找类:https : //jarscan.com/

Usage: java -jar jarscan.jar [-help | /?]
                    [-dir directory name]
                    [-zip]
                    [-showProgress]
                    <-files | -class | -package>
                    <search string 1> [search string 2]
                    [search string n]

Help:
  -help or /?           Displays this message.

  -dir                  The directory to start searching
                        from default is "."

  -zip                  Also search Zip files

  -showProgress         Show a running count of files read in

  -files or -class      Search for a file or Java class
                        contained in some library.
                        i.e. HttpServlet

  -package              Search for a Java package
                        contained in some library.
                        i.e. javax.servlet.http

  search string         The file or package to
                        search for.
                        i.e. see examples above

例:

java -jar jarscan.jar -dir C:\Folder\To\Search -showProgress -class GenericServlet

0

您可以在一个充满jar并带有一些shell的目录中找到一个类:

寻找类“ FooBar”:

LIB_DIR=/some/dir/full/of/jarfiles
for jarfile in $(find $LIBDIR -name "*.jar"); do
   echo "--------$jarfile---------------"
   jar -tvf $jarfile | grep FooBar
done

0

在上述所有内容中要添加的一件事:如果没有可用的jar可执行文件(JDK附带了JAR,JRE则没有),则可以使用unzip(或WinZip或其他方式)来完成同一件事。



0

派对晚了一点,但是...

我一直在使用JarBrowser查找在哪个jar中存在特定的类。它具有易于使用的GUI,可让您浏览所选路径中所有jar的内容。



0

这在MinGW(Windows bash环境)〜gitbash中很好用

将此函数放入HOME目录中的.bashrc文件中:

# this function helps you to find a jar file for the class
function find_jar_of_class() {
  OLD_IFS=$IFS
  IFS=$'\n'
  jars=( $( find -type f -name "*.jar" ) )
  for i in ${jars[*]} ; do 
    if [ ! -z "$(jar -tvf "$i" | grep -Hsi $1)" ] ; then
      echo "$i"
    fi
   done 
  IFS=$OLD_IFS
}

0

格列佩是一个命令行实用程序,用于在jar文件中搜索类。我是该实用程序的作者。

您可以像运行该实用程序 grepj package.Class my1.jar my2.war my3.ear

可以提供多个罐子,耳朵,战争档案。对于高级用法,请使用find提供要搜索的jar列表。



0

在Linux环境下,您可以执行以下操作:

$ find <base_dir> -name *.jar -print0 | xargs -0 -l jar tf | grep <name>

其中,name是您在jar中查找的类文件的名称,这些jar分布在以base_dir为根的目录层次结构中。


0

您可以使用locategrep

locate jar | xargs grep 'my.class'

确保updatedb在使用之前运行locate

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.