Answers:
Eclipse可以做到这一点,只需创建一个(临时)项目并将您的库放在项目的类路径中即可。然后,您可以轻松找到类。
我想到的另一个工具是Java Decompiler。它可以一次打开很多罐子,也有助于查找类。
在Linux,其它Unix系统,混帐击在Windows或Cygwin的,使用jar
(或unzip -v
),grep
和find
命令。
以下列出了与给定名称匹配的所有类文件:
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
运作方式如下:
for /R %G in (*.jar) do
-遍历所有JAR文件,递归遍历目录;将文件名存储在中%G
。@jar -tvf "%G" |
-运行Java Archive命令以列出给定档案中的所有文件名,并将结果写入标准输出;该@
符号禁止打印命令的调用。find "ClassName" > NUL
-从jar命令的输出中通过管道输入标准输入,以查找给定的类名;ERRORLEVEL
如果存在匹配项,则将其设置为1(否则为0)。&& echo %G
-如果ERRORLEVEL
非零,则将Java归档文件名写入标准输出(控制台)。grep -l "classname" *.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
jar -tvf
为unzip -l
。
要找到与给定字符串匹配的罐子:
find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;
遇到此问题时,我不知道有实用程序可以执行此操作,因此我编写了以下内容:
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();
}
}
}
还有两个不同的实用程序,分别称为“ JarScan”,可以完全满足您的要求: JarScan(inetfeedback.com)和JarScan(java.net)
user1207523的脚本对我来说很好。这是一个变体,它使用find而不是简单的扩展方式来搜索jar文件。
#!/bin/bash
for i in `find . -name '*.jar'`; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
我一直在Windows上使用过它,并且效果非常好。
findstr /s /m /c:"package/classname" *.jar, where
findstr.exe是Windows和params的标准配置:
希望这对某人有帮助。
使用的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
我发现了这种新方法
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。
ClassFinder是旨在解决此问题的程序。它允许您递归搜索目录和jar文件,以查找与模式匹配的类的所有实例。它是用Java而不是python编写的。它具有出色的GUI,使其易于使用。而且运行速度很快。此版本已在可运行的jar中预编译,因此您不必从源代码构建它。
在此处下载:ClassFinder 1.0
检查JBoss Tattletale ; 尽管我从未亲自使用过它,但这似乎是您需要的工具。
只需使用FindClassInJars util,它是一个简单的swing程序,但很有用。您可以访问http://code.google.com/p/find-class-in-jars/查看源代码或下载jar文件。
不知道为什么这里的脚本从来没有真正为我工作过。这有效:
#!/bin/bash
for i in *.jar; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; 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文件的顶级目录> <要查找的类名>
这类似于此处给出的大多数答案。但是,如果grep发现某些内容,它只会输出文件名。如果要抑制grep输出,可以将其重定向到/ dev / null,但是我也希望看到grep的输出,以便可以使用部分类名并从显示的输出列表中找出正确的类名。
类名称可以是简单的类名称(例如“ String”),也可以是完全限定的名称(例如“ java.lang.String”)。
添加另一个工具...这是一个非常简单实用的Windows工具。单击一个简单的exe文件,为其提供要搜索的目录,类名称,它将找到包含该类的jar文件。是的,它是递归的。
要在文件夹(和子文件夹)一堆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
无耻的自我提升,但您可以尝试我编写的实用程序:http : //sourceforge.net/projects/zfind
它支持最常见的存档/压缩文件(jar,zip,tar,tar.gz等),并且与许多其他jar / zip查找器不同,它支持嵌套的zip文件(zip中的zip,jar中的jar等)直到无限深度。
派对晚了一点,但是...
我一直在使用JarBrowser查找在哪个jar中存在特定的类。它具有易于使用的GUI,可让您浏览所选路径中所有jar的内容。
以下脚本将帮助您
for file in *.jar
do
# do something on "$file"
echo "$file"
/usr/local/jdk/bin/jar -tvf "$file" | grep '$CLASSNAME'
done
这在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
}
检查此插件是否可以完成您想要的工作。