在几十个JAR文件中find一个类?

你会如何在大量的jar文件中find一个特定的类名?

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

Eclipse可以做到这一点,只需创build一个(临时)项目,并将您的库放在项目类path中。 然后你可以很容易地find类。

Java反编译器是我想到的另一个工具。 它可以一次打开很多jar子,也有助于find课程。

Unix的

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

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

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

如果您知道要search的整个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 

视窗

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

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

这是如何工作的:

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

卷筒纸

使用扫描JAR文件的search引擎 。

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

 grep -l "classname" *.jar 

给你的jar子的名字

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

给你的课程包

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

当我遇到这个问题时,我并不知道有这样一个工具,所以我写了下面的内容:

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

查找与给定string匹配的jar子:

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

JarScan(inetfeedback.com)和JarScan(java.net)也有两个不同的实用程序,分别称为“JarScan”

user1207523的脚本适合我。 这是一个使用find来searchjar文件的变体,而不是简单的扩展;

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

我发现了这个新的方法

 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或者用find命令HTH Someoneinput到xargs。

我一直在Windows上使用它,它的工作非常好。

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

findstr.exe标准的Windows和参数:

  • / s =recursion
  • / m =如果匹配,只打印文件名
  • / c =文字string(在这种情况下,您的软件包名称和类名由“/”分隔)

希望这有助于某人。

检查JBoss Tattletale ; 虽然我从来没有使用过它,这似乎是你需要的工具。

不知道为什么这里的脚本从来没有真正为我工作。 这工作:

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

要search特定目录中的所有jar文件,可以这样做:

 ls *.jar | xargs grep -F MyClass 

或者甚至更简单,

 grep -F MyClass *.jar 

输出如下所示:

 Binary file foo.jar matches 

这是非常快的,因为-F选项意味着search固定string,所以它不会为每个grep调用加载正则expression式引擎。 如果您需要,您可以随时省略-F选项并使用正则expression式。

使用unzip (zipinfo) bash script解决scheme。 在Ubuntu 12上testing

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

脚本查找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文件的顶级目录> <要查找的类名>

这与这里给出的大多数答案类似。 但是它只输出文件名,如果grepfind的话。 如果你想压制grep输出,你可以把它redirect到/ dev / null,但是我更喜欢看到grep的输出,所以我可以使用部分类名,并从显示的输出列表中找出正确的。

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

你可以在一个装满了一些shell的jar目录下find一个类:

寻找“FooBar”课程:

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

基本上让我看看提出的问题的根源。 如果你正在做一个新的项目 – 为什么不到技术总监或技术主pipe那里问问他 – 他如何跟踪依赖关系?

有一件事需要补充:如果你没有jar可执行文件(它附带了JDK而不是JRE),你可以使用unzip(或者WinZip,或者其他)来完成同样的事情。

只需使用FindClassInJars util,这是一个简单的swing程序,但是很有用。 您可以在http://code.google.com/p/find-class-in-jars/查看源代码或下载jar文件;

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

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

晚会有点迟,但是…

我一直在使用JarBrowser来查找某个类在哪个jar中。 它有一个易于使用的graphics用户界面,允许您浏览所有path中的所有jar子的内容。

以下脚本将帮助你

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

要添加另一个…这是一个非常简单和有用的工具的Windows。 一个简单的exe文件,你点击,给它一个目录来search,一个类名,它会find包含该类的jar文件。 是的,它是recursion的。

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

这个在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 } 

Grepj是一个命令行工具,可以在jar文件中search类。 我是该实用程序的作者。

你可以像grepj package.Class my1.jar my2.war my3.ear一样运行这个工具

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

检查这个插件的Eclipse可以做你正在寻找的工作。

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

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

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

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

你可以使用locategrep

 locate jar | xargs grep 'my.class' 

确保在使用locate之前运行updatedb

使用这个..你可以find任何文件在classpath ..保证..

 import java.net.URL; import java.net.URLClassLoader; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class FileFinder { public static void main(String[] args) throws Exception { String file = <your file name>; ClassLoader cl = ClassLoader.getSystemClassLoader(); URL[] urls = ((URLClassLoader)cl).getURLs(); for(URL url: urls){ listFiles(file, url); } } private static void listFiles(String file, URL url) throws Exception{ ZipInputStream zip = new ZipInputStream(url.openStream()); while(true) { ZipEntry e = zip.getNextEntry(); if (e == null) break; String name = e.getName(); if (name.endsWith(file)) { System.out.println(url.toString() + " -> " + name); } } } }