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

时间:2009-08-27 18:23:47

标签: java class jar project-structure text-search

如何在大量jar文件中找到特定的类名?

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

35 个答案:

答案 0 :(得分:363)

的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

打开command prompt,切换到包含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命令的输出中搜索标准输入,用于给定的类名;如果有匹配(否则为0),这会将ERRORLEVEL设置为1。
  4. && echo %G - iff ERRORLEVEL非零,将Java归档文件名写入标准输出(控制台)。
  5. 网络

    使用扫描search engineJAR files

答案 1 :(得分:57)

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

答案 2 :(得分:53)

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

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

答案 3 :(得分:23)

grep -l "classname" *.jar

为您提供jar的名称

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

为您提供课程的包

答案 4 :(得分:11)

#!/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

答案 5 :(得分:7)

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

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

}

答案 6 :(得分:7)

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

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

答案 7 :(得分:5)

还有两个名为“JarScan”的不同实用程序,它们完全符合您的要求: JarScan (inetfeedback.com)JarScan (java.net)

答案 8 :(得分:3)

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

dictionary-I-Z.plist

findstr.exe标配Windows和params:

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

希望这有助于某人。

答案 9 :(得分:3)

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

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

答案 10 :(得分: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或输入xargs with find命令HTH Someone。

答案 11 :(得分:2)

使用bash script的{​​{1}}解决方案。在unzip (zipinfo)上进行了测试。

Ubuntu 12

答案 12 :(得分:1)

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

ls *.jar | xargs grep -F MyClass

或者,甚至更简单,

grep -F MyClass *.jar

输出如下:

Binary file foo.jar matches

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

答案 13 :(得分:1)

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

在此处下载:ClassFinder 1.0

答案 14 :(得分: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&lt;包含jar文件的顶级目录&gt; &LT;要查找的班级名称&gt;

这与此处给出的大多数答案类似。但它只输出文件名,如果grep找到了什么。如果要抑制grep输出,可以将其重定向到/ dev / null,但我更喜欢看到grep的输出,这样我就可以使用部分类名,并从显示的输出列表中找出正确的名称。

类名可以是简单的类名,如“String”或完全限定的名称,如“java.lang.String”

答案 15 :(得分:1)

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

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

答案 16 :(得分:1)

不确定为什么这里的脚本从未真正为我工作过。这有效:

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

答案 17 :(得分:1)

只需使用FindClassInJars工具,它就是一个简单的swing程序,但很有用。您可以在http://code.google.com/p/find-class-in-jars/

检查源代码或下载jar文件

答案 18 :(得分:1)

检查JBoss Tattletale;虽然我从未亲自使用它,但这似乎是你需要的工具。

答案 19 :(得分:0)

我知道这是一个老问题,但是...
我遇到了同样的问题,因此,如果有人正在寻找Windows的非常简单的解决方案-有一个名为Locate32的软件 只需将jar作为文件扩展名
并包含类名称
它会在几秒钟内找到文件。

Locate32 in action

答案 20 :(得分:0)

以下脚本将帮助您

for file in *.jar
do
  # do something on "$file"
  echo "$file"
  /usr/local/jdk/bin/jar -tvf "$file" | grep '$CLASSNAME'
done

答案 21 :(得分:0)

你可以在一个装满了一些shell的jar目录中找到一个类:

寻找班级“FooBar”:

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

答案 22 :(得分:0)

文件名:searchForFiles.py

import os, zipfile, glob, sys

def main():
    searchFile = sys.argv[1] #class file to search for, sent from batch file below (optional, see second block of code below)
    listOfFilesInJar = []
    for file in glob.glob("*.jar"):
        archive = zipfile.ZipFile(file, 'r')
        for x in archive.namelist():
            if str(searchFile) in str(x):
                listOfFilesInJar.append(file)

    for something in listOfFilesInJar:
        print("location of "+str(searchFile)+": ",something)

if __name__ == "__main__":
    sys.exit(main())

您可以通过使用以下文本制作.bat文件来轻松运行此文件(将“ AddWorkflows.class”替换为要搜索的文件):

(文件:CallSearchForFiles.bat)

@echo off
python -B -c "import searchForFiles;x=searchForFiles.main();" AddWorkflows.class
pause

您可以双击CallSearchForFiles.bat来运行它,或从命令行“ CallSearchForFiles.bat SearchFile.class”中调用它

Click to See Example Output

答案 23 :(得分:0)

要在文件夹(和子文件夹)一堆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

答案 24 :(得分:0)

如果您有一个类的实例,或者可以获得一个实例,那么您将拥有一个纯java解决方案:

try{
    Class clazz = Class.forName("        try{
        Class clazz = Class.forName("class-name");
        String name = "/"+clazz.getName().replace('.', '/')+".class";
        URL url = clazz.getResource(name);
        String jar = url.toString().substring(10).replaceAll("!.*", "");
        System.out.println( jar );
    }catch(Exception err){
        err.printStackTrace();
    }

当然,前两行必须根据您拥有类或类名实例的位置进行调整。

答案 25 :(得分:0)

在eclipse中,您可以使用旧的但仍然可用的插件jarsearch

答案 26 :(得分:0)

使用此..你可以在classpath中找到任何文件..保证..

words = input("Enter a word to find its length: ")

for x in words:
    print x, len(x)

答案 27 :(得分:0)

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

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

name 是您在以 base_dir <为根的目录层次结构中分布的jar内查找的类文件的名称/ EM>

答案 28 :(得分:0)

检查此插件的eclipse,它可以完成您正在寻找的工作。

https://marketplace.eclipse.org/content/jarchiveexplorer

答案 29 :(得分:0)

要添加到上述所有内容中的一件事:如果您没有可用的jar可执行文件(它随JDK一起提供但不包含JRE),您可以使用unzip(或WinZip,或其他)来完成同样的事情。

答案 30 :(得分:0)

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

您可以像grepj package.Class my1.jar my2.war my3.ear

一样运行该实用程序

可以提供多个jar,ear,war文件。对于高级用法,请使用find提供要搜索的jar列表。

答案 31 :(得分: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
}

答案 32 :(得分:0)

无耻的自我推销,但你可以尝试我写的实用工具:http://sourceforge.net/projects/zfind

它支持大多数常见的存档/压缩文件(jar,zip,tar,tar.gz等),与许多其他jar / zip查找器不同,它支持嵌套的zip文件(zip中的zip,jar中的jar等),直到无限深度。

答案 33 :(得分:0)

派对有点晚了,但不过......

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

答案 34 :(得分:-2)

基本上让我看一下问题的根源。 如果您正在进行一个新项目 - 为什么不来到PM或技术主管并询问他 - 他如何跟踪依赖项?