Иногда бывает так надо просмотреть все jar файлы в указанной директории и найти определенный Java класс. Оно то, возможно, существует немыслимое колличество сторонних утилит, которые делают то же самое. Но, как очень часто бывает, то времени нет искать их, то изучать, то еще чего нить.
Вот и появился такой код
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
package com.delfin.jar.analyzer; import java.io.File; import java.io.IOException; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class JarAnalyzer { private static abstract class RecursiveDirBypasser { public void bypass(File dir) { if (!dir.isDirectory()) { try { processFile(dir); } catch (IOException e) { log("Error process file " + dir.getAbsolutePath(), e); } } File[] files = dir.listFiles(); if (files == null) { return; } for (File f : files) { bypass(f); } } protected abstract void processFile(File dir) throws IOException; } public static void main(String[] args) { String dirPath = args[0]; final String entryName = args[1].toLowerCase(); final List<String> result = new LinkedList<String>(); new RecursiveDirBypasser() { @Override protected void processFile(File f) throws IOException { if (!isJar(f)) { return; } log("$$$: " + f.getAbsolutePath()); JarFile jarFile = null; try { jarFile = new JarFile(f); Enumeration<JarEntry> entries = jarFile.entries(); while (entries.hasMoreElements()) { String name = entries.nextElement().getName(); if (name != null && name.equalsIgnoreCase(entryName)) { result.add(f.getAbsolutePath()); } log('\t' + name); } } finally { if (jarFile != null) { try { jarFile.close(); } catch (IOException e) { log("Error closing jar file " + f.getAbsolutePath(), e); } } } } private boolean isJar(File f) { String fileName = f.getName(); int i = fileName.lastIndexOf('.'); return i < 0 ? false : "jar".equalsIgnoreCase(fileName.substring(i + 1)); } }.bypass(new File(dirPath)); log("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); log("Found " + result.size() + " matches"); for (String match : result) { log('\t' + match); } } public static void log(String msg, Throwable e) { System.err.println(msg); e.printStackTrace(); } private static void log(String msg) { System.out.println(msg); } } |
После компиляции можно запускать с параметрами: путь к директории с jar файлами и имя класса в формате com/delfin/MyClass.class
Как идею к дальнейшему развитию кода можно обозначить:
- добавить UI
- научить искать во вложенных jar-ках (когда один jar файл содержит другой jar)