jarファイルの中のクラスをさがす
2014/04/05
jar
java
Javaです。たくさんあるjarファイルの中から特定のクラスファイルがあるのを探したい。
以前にも似たようなことしてたんですけどね。
notclassfound とクラス名でグーグルさんに尋ねると、わかるときもありますが、そのjarファイルがあるかまた調べないといけないので、いっそ、ルートのディレクトリのそれいかにあるjarファイルを根こそぎ調べたほうがはやいだろうということで、作成。
拡張子jarをJarFileで読んで、エントリーを調べる。
意外とさくっとみつかったり。
Swing GUIから使えるようにするためにSwingWorkerを継承して作成してます。
以前にも似たようなことしてたんですけどね。
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;
}
}
: