プログラマメモ2 - programmer no memo2

jarファイルの中のクラスをさがす 2014/04/05

Javaです。たくさんあるjarファイルの中から特定のクラスファイルがあるのを探したい。

以前にも似たようなことしてたんですけどね。


notclassfound とクラス名でグーグルさんに尋ねると、わかるときもありますが、そのjarファイルがあるかまた調べないといけないので、いっそ、ルートのディレクトリのそれいかにあるjarファイルを根こそぎ調べたほうがはやいだろうということで、作成。

拡張子jarをJarFileで読んで、エントリーを調べる。
意外とさくっとみつかったり。

Swing GUIから使えるようにするためにSwingWorkerを継承して作成してます。



package t026; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; import javax.swing.SwingWorker; public abstract class Search extends SwingWorker<Object, Object> { /** * 実行経過、結果の受け渡し用 * */ public interface Appender { public void append(String s); } String matchWord; File searchRoot; Appender log; Appender logResult; class Result { File file; String className; public String toString() { String s = file.getAbsolutePath(); s += "\n" + className; return s; } } public void searchStart() { search(searchRoot, matchWord); } public List<Result> search(File searchRoot, String matchWord) { List<Result> list = new ArrayList<Search.Result>(); if (!searchRoot.isDirectory()) return list; File[] files = searchRoot.listFiles(); for (File file : files) { // トマレなら if (isCancelled()) return list; if (file.isDirectory()) { list.addAll(search(file, matchWord)); continue; } // 拡張子がjarのもののみ対象 if (!file.getName().endsWith(".jar")) { continue; } publish(file); JarFile jarFile = null; try { // ここで検索とマッチするか調べる jarFile = new JarFile(file); Enumeration<JarEntry> enumeration = jarFile.entries(); j: while (enumeration.hasMoreElements()) { // トマレなら if (isCancelled()) return list; JarEntry jarEntry = enumeration.nextElement(); // System.out.println(jarEntry.getName()); if (jarEntry.isDirectory()) continue; // 含まれるかどうかチェック if (jarEntry.getName().contains(matchWord)) { // ひとつでもみつかれば Result result = new Result(); result.file = file; result.className = jarEntry.getName(); list.add(result); // 実行結果 publish(result); break j; } } } catch (IOException e) { // 失敗するケースがあるっぽいので e.printStackTrace(); System.err.println(file); } finally { try { jarFile.close(); } catch (IOException e) { } } } return list; } }

: