可随意转载,但请注明出处及作者 SonyMusic 2003.05.28 ========================================================================== 一个用于在一堆zip/jar文件中查找某一个类的程序 package sony.utils; import java.util.jar.*; import java.util.zip.*; import java.util.*; import java.io.*; /** * @author SonyMusic * * 很简单,但可能会很有用的程序,用于在指定目录下的所有zip/jar文件中查找某个类.<br> * 至少我觉得是用的,呵呵。有时面对着jrun那一堆.jar文件中,想找到某个类还真不容易。<br> * <b>usage:</b> java sony.utils.FindClass baseDir className */ public class FindClass { public static void main(String[] args) { if(args.length!=2){ printUseage(-1); return; } File base=new File(args[0]); if(!base.exists()){ System.out.println("Base Dir not exist!"); printUseage(-2); } if(!base.isDirectory()){ System.out.println("Base Dir is a file!"); printUseage(-3); } List zipList=getSubJarFiles(base); ZipFile zfile=null; try { int fCount=0; for (int i = 0; i <zipList.size(); i++) { zfile=new ZipFile((File)zipList.get(i)); Enumeration enum=zfile.entries(); while (enum.hasMoreElements()) { ZipEntry ze = (ZipEntry) enum.nextElement(); if(matchEntry(ze, args[1])){ System.out.println("Found in zip/jar file: "+zfile.getName()+"/tFileName:"+ze.getName()); ++fCount; break; } } } if(fCount==0){ System.out.println("not found. maybe BaseDir or ClassName is not correct."); printUseage(0); } else{ System.out.println("Found "+fCount+" zip/jar file(s)"); } } catch (Exception e) { e.printStackTrace(); printUseage(-10); } } private static void printUseage(int retStatus){ System.out.println("useage: java sony.utils.FindClass baseDir className"); System.out.println("/tbaseDir: where you want to find. e.g. d://web//web-inf//lib"); System.out.println("/tclassName: waht you want to find. e.g. HttpServlet"); System.out.println(); System.exit(retStatus); } private static List getSubJarFiles(File baseDir){ List ret=new ArrayList(); //File base=new File(baseDir); File[] tmp=baseDir.listFiles(fileFilter); for (int i = 0; i <tmp.length; i++) { if(tmp[i].isFile()){ ret.add(tmp[i]); } if(tmp[i].isDirectory()){ ret.addAll(getSubJarFiles(tmp[i])); } } return ret; } private static boolean matchEntry(ZipEntry ze, String className){ StringTokenizer st=new StringTokenizer(ze.getName(), "/"); String fileName=null; while (st.hasMoreTokens()) { fileName=st.nextToken(); } if(fileName.equals(className+".class")){ return true; } else return false; } private static FileFilter fileFilter=new FileFilter(){ public boolean accept(File pathname) { String tmp=pathname.getName().toLowerCase(); if(tmp.endsWith(".jar") || tmp.endsWith(".zip")){ return true; } return false; } }; }
