Найти class где-нибудь в десятках файлов JAR?

Как бы вы нашли определенное имя classа внутри большого количества файлов jar?

(Ищите фактическое имя classа, а не classы, которые ссылаются на него).

    Eclipse может это сделать, просто создайте (временный) проект и поместите свои библиотеки в class объектов classpath. Тогда вы можете легко найти classы.

    Еще один инструмент, который приходит мне на ум, – это Java Decompiler. Он может открывать сразу множество банок и помогает находить classы.

    Юникс

    Используйте команды jar (или unzip -v ), grep и find .

    Например, следующее перечисляет все файлы classов, которые соответствуют заданному имени:

     for i in *.jar; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done 

    Если вам известен весь список архивов Java, которые вы хотите найти, вы можете разместить их в одном каталоге, используя (символические) ссылки.

    Или используйте find (case sensitive), чтобы найти JAR-файл, содержащий заданное имя classа:

     find path/to/libs -name '*.jar' -exec grep -Hls ClassName {} \; 

    Например, чтобы найти имя архива, содержащего IdentityHashingStrategy :

     $ find . -name "*.jar" -exec grep -Hsli IdentityHashingStrategy {} \; ./trove-3.0.3.jar 

    Если JAR может быть где угодно в системе и доступна команда locate :

     for i in $(locate "*.jar"); do echo $i; jar -tvf $i | grep -Hsi ClassName; done 

    Windows

    Откройте командную строку , перейдите в каталог (или каталог предка), содержащий файлы JAR, а затем:

     for /R %G in (*.jar) do @jar -tvf "%G" | find "ClassName" > NUL && echo %G 

    Вот как это работает:

    1. for /R %G in (*.jar) do – цикл по всем JAR-файлам, рекурсивно перемещающимся каталогам; сохраните имя файла в% G.
    2. @jar -tvf "%G" | – запустите команду Java Archive, чтобы отобразить все имена файлов в данном архиве и записать результаты в стандартный вывод; символ @ подавляет печать вызова команды.
    3. find "ClassName" > NUL – поиск стандартного ввода, поданного с выхода команды jar, для данного имени classа; это установит ERRORLEVEL в 1, если есть совпадение (иначе 0).
    4. && echo %G – iff ERRORLEVEL не равно нулю, напишите имя файла архива Java на стандартный вывод (консоль).

    Web

    Используйте поисковую систему, которая сканирует файлы JAR .

    некоторое время назад я написал программу только для этого: https://github.com/javalite/jar-explorer

     grep -l "classname" *.jar 

    дает название банке

     find . -name "*.jar" -exec jar -t -f {} \; | grep "classname" 

    дает вам пакет classа

     #!/bin/bash pattern=$1 shift for jar in $(find $* -type f -name "*.jar") do match=`jar -tvf $jar | grep $pattern` if [ ! -z "$match" ] then echo "Found in: $jar" echo "$match" fi done 

    Я не знал об утилите, когда я сталкивался с этой проблемой, поэтому написал следующее:

     public class Main { /** * */ private static String CLASS_FILE_TO_FIND = "class.to.find.Here"; private static List foundIn = new LinkedList(); /** * @param args the first argument is the path of the file to search in. The second may be the * class file to find. */ public static void main(String[] args) { if (!CLASS_FILE_TO_FIND.endsWith(".class")) { CLASS_FILE_TO_FIND = CLASS_FILE_TO_FIND.replace('.', '/') + ".class"; } File start = new File(args[0]); if (args.length > 1) { CLASS_FILE_TO_FIND = args[1]; } search(start); System.out.println("------RESULTS------"); for (String s : foundIn) { System.out.println(s); } } private static void search(File start) { try { final FileFilter filter = new FileFilter() { public boolean accept(File pathname) { return pathname.getName().endsWith(".jar") || pathname.isDirectory(); } }; for (File f : start.listFiles(filter)) { if (f.isDirectory()) { search(f); } else { searchJar(f); } } } catch (Exception e) { System.err.println("Error at: " + start.getPath() + " " + e.getMessage()); } } private static void searchJar(File f) { try { System.out.println("Searching: " + f.getPath()); JarFile jar = new JarFile(f); ZipEntry e = jar.getEntry(CLASS_FILE_TO_FIND); if (e == null) { e = jar.getJarEntry(CLASS_FILE_TO_FIND); if (e != null) { foundIn.add(f.getPath()); } } else { foundIn.add(f.getPath()); } } catch (IOException e) { e.printStackTrace(); } } } 

    Чтобы найти банки, которые соответствуют заданной строке:

    find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;

    Существуют также две разные утилиты, называемые «JarScan», которые делают именно то, что вы просите: JarScan (inetfeedback.com) и JarScan (java.net)

    Сценарий user1207523 отлично подходит для меня. Вот вариант, который ищет файлы jar с помощью утилиты find вместо простого расширения;

     #!/bin/bash for i in `find . -name '*.jar'`; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done 

    Я всегда использовал это в Windows, и он работал исключительно хорошо.

     findstr /s /m /c:"package/classname" *.jar, where 

    findstr.exe поставляется с Windows и параметрами:

    • / s = рекурсивно
    • / m = печатать только имя файла, если есть совпадение
    • / c = literal (в этом случае имя вашего пакета + имена classов, разделенные символом «/»)

    Надеюсь, это поможет кому-то.

    Решение bash script с помощью unzip (zipinfo) . Протестировано на Ubuntu 12 .

     #!/bin/bash # ./jarwalker.sh "/a/Starting/Path" "aClassName" IFS=$'\n' jars=( $( find -P "$1" -type f -name "*.jar" ) ) for jar in ${jars[*]} do classes=( $( zipinfo -1 ${jar} | awk -F '/' '{print $NF}' | grep .class | awk -F '.' '{print $1}' ) ) if [ ${#classes[*]} -ge 0 ]; then for class in ${classes[*]} do if [ ${class} == "$2" ]; then echo "Found in ${jar}" fi done fi done 

    Я нашел этот новый способ

     bash $ ls -1 | xargs -i -t jar -tvf '{}'| grep Abstract jar -tvf activation-1.1.jar jar -tvf antisamy-1.4.3.jar 2263 Thu Jan 13 21:38:10 IST 2011 org/owasp/validator/html/scan/AbstractAntiSamyScanner.class ... 

    Таким образом, это перечисляет jar и class, если они найдены, если вы хотите, вы можете дать ls -1 * .jar или ввести xargs с командой find HTH Someone.

    Проверьте JBoss Tattletale ; хотя я никогда не использовал его лично, это, похоже, инструмент, который вам нужен.

    Просто используйте FindClassInJars, это простая программа качания, но полезная. Вы можете проверить исходный код или загрузить файл jar по адресу http://code.google.com/p/find-class-in-jars/.

    Не знаю, почему сценарии здесь никогда не работали для меня. Это работает:

     #!/bin/bash for i in *.jar; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done 

    Для поиска всех файлов jar в заданном каталоге для определенного classа вы можете сделать это:

     ls *.jar | xargs grep -F MyClass 

    или, что еще проще,

     grep -F MyClass *.jar 

    Результат выглядит следующим образом:

     Binary file foo.jar matches 

    Это очень быстро, потому что опция -F означает поиск фиксированной строки, поэтому она не загружает механизм регулярных выражений для каждого вызова grep. Если вам нужно, вы всегда можете опустить опцию -F и использовать регулярные выражения.

    Скрипт для поиска файла jar: find_jar.sh

     IFS=$(echo -en "\n\b") # Set the field separator newline for f in `find ${1} -iname *.jar`; do jar -tf ${f}| grep --color $2 if [ $? == 0 ]; then echo -n "Match found: " echo -e "${f}\n" fi done unset IFS 

    Использование: ./find_jar.sh <каталог верхнего уровня, содержащий файлы jar> <Имя класса для поиска>

    Это похоже на большинство ответов, приведенных здесь. Но он выводит только имя файла, если grep находит что-то. Если вы хотите подавить вывод grep, вы можете перенаправить его в / dev / null, но я также предпочитаю видеть вывод grep, чтобы я мог использовать частичные имена classов и вычислять правильный из отображаемого списка.

    Имя classа может быть как простым именем classа. Как «String» или полное имя типа «java.lang.String»,

    Чтобы добавить еще один инструмент … это очень простой и полезный инструмент для окон. Простой файл exe, на который вы нажимаете, дает ему каталог для поиска, имя classа, и он найдет файл jar, содержащий этот class. Да, это рекурсивно.

    http://sourceforge.net/projects/jarfinder/

    Вы можете найти class в каталоге, заполненном баночками с небольшим количеством оболочки:

    Поиск classа «FooBar»:

     LIB_DIR=/some/dir/full/of/jarfiles for jarfile in $(find $LIBDIR -name "*.jar"); do echo "--------$jarfile---------------" jar -tvf $jarfile | grep FooBar done 

    Одна вещь, чтобы добавить ко всему вышесказанному: если у вас нет доступного jar-исполняемого файла (он поставляется с JDK, но не с JRE), вы можете использовать unzip (или WinZip или что-то еще), чтобы выполнить одно и то же.

    бесстыдное саморекламу, но вы можете попробовать утилиту, которую я написал: http://sourceforge.net/projects/zfind

    Он поддерживает большинство распространенных архивных / сжатых файлов (jar, zip, tar, tar.gz и т. Д.) И в отличие от многих других jar / zip finders, поддерживает вложенные файлы zip (zip в zip, jar в jar и т. Д.) До неограниченной глубины.

    Немного поздно на вечеринку, но тем не менее …

    Я использовал JarBrowser, чтобы найти в нем jar определенный class. Он имеет простой в использовании графический интерфейс, который позволяет просматривать содержимое всех банок на выбранном пути.

    Следующий скрипт поможет вам

     for file in *.jar do # do something on "$file" echo "$file" /usr/local/jdk/bin/jar -tvf "$file" | grep '$CLASSNAME' done 

    Это хорошо работает в MinGW (среда Windows bash) ~ gitbash

    Поместите эту функцию в ваш .bashrc-файл в вашем каталоге HOME:

     # this function helps you to find a jar file for the class function find_jar_of_class() { OLD_IFS=$IFS IFS=$'\n' jars=( $( find -type f -name "*.jar" ) ) for i in ${jars[*]} ; do if [ ! -z "$(jar -tvf "$i" | grep -Hsi $1)" ] ; then echo "$i" fi done IFS=$OLD_IFS } 

    Grepj – это утилита командной строки для поиска classов в файлах jar. Я автор полезности.

    Вы можете запустить утилиту как grepj package.Class my1.jar my2.war my3.ear

    Могут быть предоставлены несколько банок, ушей, военных файлов. Для расширенного использования используйте find, чтобы предоставить список баннеров для поиска.

    Проверьте этот плагин для eclipse, который может выполнять работу, которую вы ищете.

    https://marketplace.eclipse.org/content/jarchiveexplorer

    В среде Linux вы можете сделать следующее:

     $ find  -name *.jar -print0 | xargs -0 -l jar tf | grep  

    Где имя – это имя файла classа, который вы просматриваете в банках, распределенных по иерархии каталогов, внедренных в base_dir .

    Вы можете использовать locate и grep :

     locate jar | xargs grep 'my.class' 

    Убедитесь, что вы запустили updatedb перед использованием locate .

    Используйте это .. вы можете найти любой файл в classpath .. гарантировано ..

     import java.net.URL; import java.net.URLClassLoader; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class FileFinder { public static void main(String[] args) throws Exception { String file = ; ClassLoader cl = ClassLoader.getSystemClassLoader(); URL[] urls = ((URLClassLoader)cl).getURLs(); for(URL url: urls){ listFiles(file, url); } } private static void listFiles(String file, URL url) throws Exception{ ZipInputStream zip = new ZipInputStream(url.openStream()); while(true) { ZipEntry e = zip.getNextEntry(); if (e == null) break; String name = e.getName(); if (name.endsWith(file)) { System.out.println(url.toString() + " -> " + name); } } } } 

    В eclipse вы можете использовать старый, но все еще пригодный для использования плагин jarsearch

    Давайте будем гением компьютера.