作者: cherami
做java开发的人可能都遇到过面对一大堆的jar包但是自己不知道需要的那些个类到底位于哪个jar包中,使用下面的代码,这个问题就可以迎刃而解了。
import java.io.file;
import java.util.arraylist;
import java.util.enumeration;
import java.util.list;
import java.util.zip.zipentry;
import java.util.zip.zipfile;
public class findinjar {
public string classname;
public arraylist jarfiles = new arraylist();
public findinjar() {
}
public findinjar(string classname) {
this.classname = classname;
}
public void setclassname(string classname) {
this.classname = classname;
}
public list findclass(string dir, boolean recurse) {
searchdir(dir, recurse);
return this.jarfiles;
}
protected void searchdir(string dir, boolean recurse) {
try {
file d = new file(dir);
if (!d.isdirectory()) {
return;
}
file[] files = d.listfiles();
for (int i = 0; i < files.length; i++) {
if (recurse && files[i].isdirectory()) {
searchdir(files[i].getabsolutepath(), true);
} else {
string filename = files[i].getabsolutepath();
if (filename.endswith(".jar")||filename.endswith(".zip")) {
zipfile zip = new zipfile(filename);
enumeration entries = zip.entries();
while (entries.hasmoreelements()) {
zipentry entry = (zipentry) entries.nextelement();
string thisclassname = getclassname(entry);
if (thisclassname.equals(this.classname) || thisclassname.equals(this.classname + ".class")) {
this.jarfiles.add(filename);
}
}
}
}
}
} catch (exception e) {
e.printstacktrace();
}
}
public list getfilenames() {
return this.jarfiles;
}
protected string getclassname(zipentry entry) {
stringbuffer classname = new stringbuffer(entry.getname().replace(’/', ‘.’));
return classname.tostring();
}
public static void main(string args[]) {
findinjar findinjar = new findinjar("javax.mail.session");
list jarfiles = findinjar.findclass("d:/libs/", true);
if (jarfiles.size() == 0) {
system.out.println("not found");
} else {
for (int i = 0; i < jarfiles.size(); i++) {
system.out.println(jarfiles.get(i));
}
}
}
}
main方法中的findclass方法的第二个参数是是否对指定的目录递归进行处理,一般都会要这样做的吧。
原文地址:http://www.jiehoo.com/find-jar-through-class-name.htm