查找缺少的類在哪個包中

經常碰到編譯時出現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程序,採用可視化的操作界面,可以將要搜索的路徑都添加進來,輸入類名,

然後搜索.有時間再做吧.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章