經常碰到編譯時出現classNotFound的情況,可是面對一大堆jar文件,又不知該將哪一個加到classpath.有沒有辦法根據提示缺少的類名搜索在哪個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 getFilename() {
return this.jarFiles;
}
protected String getClassName(ZipEntry entry){
StringBuffer className=new StringBuffer(entry.getName().replace('/','.'));
return className.toString();
}
public static void main(String args[]){
if(args.length<2){
System.out.println("Usage: FindInJar <ClassName> <Directory>");
return;
}
String classname=args[0];
String dirname=args[1];
FindInJar findInJar=new FindInJar(classname);
List jarFiles=findInJar.findClass(dirname,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));
}
}
}
}
我在考慮將這個程序做成一個windows程序,採用可視化的操作界面,可以將要搜索的路徑都添加進來,輸入類名,
然後搜索.有時間再做吧.