你如何在很多jar文件中找到特定的类名?
(寻找实际的类名,而不是引用它的类。)
Eclipse可以做到这一点,只需创建一个(临时)项目并将您的库放在项目类路径上。然后你可以轻松找到这些课程。
我想到的另一个工具是Java Decompiler。它可以同时打开很多罐子,也可以帮助找到课程。
我一直在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或输入xargs with find命令HTH Someone。
检查JBoss Tattletale;虽然我从未亲自使用它,但这似乎是你需要的工具。
只需使用FindClassInJars工具,它就是一个简单的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文件,可以执行以下操作:
ls *.jar | xargs grep -F MyClass
或者,甚至更简单
grep -F MyClass *.jar
输出如下:
Binary file foo.jar matches
它非常快,因为-F选项意味着搜索固定字符串,因此它不会为每个grep调用加载正则表达式引擎。如果需要,可以始终省略-F选项并使用正则表达式。
用于查找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文件。是的,这是递归的。
你可以在一个带有一点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
使用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
打开command prompt,切换到包含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 iff匹配(否则为0)。&& echo %G
- iff ERRORLEVEL
非零,将Java归档文件名写入标准输出(控制台)。使用扫描search engine的JAR files。
添加到上述所有内容的一件事是:如果你没有可用的jar可执行文件(它带有JDK而不是JRE),你可以使用unzip(或WinZip,或其他)来完成同样的事情。
无耻的自我推销,但你可以尝试我写的实用程序: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
}
Grepj是一个命令行实用程序,用于搜索jar文件中的类。我是该实用程序的作者。
您可以像grepj package.Class my1.jar my2.war my3.ear
一样运行该实用程序
可以提供多个罐子,耳朵,战争文件。对于高级用法,请使用find提供要搜索的jar列表。
检查这个插件的eclipse,它可以完成你正在寻找的工作。
在Linux环境下,您可以执行以下操作:
$ find <base_dir> -name *.jar -print0 | xargs -0 -l jar tf | grep <name>
其中name是您在以base_dir为根的目录层次结构中分布的jar文件中查找的类文件的名称。
你可以使用locate
和grep
:
locate jar | xargs grep 'my.class'
确保在使用updatedb
之前运行locate
。
使用此..你可以在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);
}
}
}
}
前段时间,我为此写了一个程序:https://github.com/javalite/jar-explorer
在eclipse中你可以使用旧的但仍然可用的插件jarsearch
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();
}
}
}
要找到与给定字符串匹配的jar:
find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;
还有两个不同的实用工具叫做“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