Як би ви знайшли назву конкретного класу у великій кількості файлів jar?
(Шукаєш власне ім’я класу, а не класи, на які посилається.)
Як би ви знайшли назву конкретного класу у великій кількості файлів jar?
(Шукаєш власне ім’я класу, а не класи, на які посилається.)
Відповіді:
Eclipse може це зробити, просто створити (тимчасовий) проект і поставити свої бібліотеки на клас проектів проектів. Тоді ви можете легко знайти заняття.
Ще один інструмент, який мені спадає на думку, - це Java Decompiler. Це може відкрити відразу багато банок і допоможе знайти заняття.
В Linux, інших варіантах Unix, Git Bash для Windows або Cygwin, використовуйте команди jar
(або unzip -v
) grep
та find
команди.
Далі перелічені всі файли класів, які відповідають заданому імені:
for i in *.jar; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done
Якщо ви знаєте весь список архівів Java, який ви хочете шукати, ви можете розмістити їх у одному каталозі за допомогою (символічних) посилань.
Або скористайтеся find
(з урахуванням регістру), щоб знайти файл JAR, який містить задане ім’я класу:
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
Варіант синтаксису:
find path/to/libs -name '*.jar' -print | \
while read i; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done
Відкрийте командний рядок , перейдіть до каталогу (або каталогу предків), що містить файли JAR, а потім:
for /R %G in (*.jar) do @jar -tvf "%G" | find "ClassName" > NUL && echo %G
Ось як це працює:
for /R %G in (*.jar) do
- циклічно переглядайте всі файли JAR, рекурсивно проходжуючи каталоги; зберегти ім'я файлу в %G
.@jar -tvf "%G" |
- запустіть команду Java Archive, щоб перелічити всі назви файлів у даному архіві, а результати записати на стандартний вихід; то @
символ пригнічує друк виклику даної команди.find "ClassName" > NUL
- шукати стандартне введення, покладене на висновку команди jar, для заданої назви класу; це встановить ERRORLEVEL
значення 1, якщо є відповідність (інакше 0).&& echo %G
- якщо iff ERRORLEVEL
не дорівнює нулю, запишіть ім'я файлу архіву Java на стандартний вихід (консоль).Використовуйте пошукову систему, яка сканує файли JAR .
деякий час тому я написав програму саме для цього: https://github.com/javalite/jar-explorer
grep -l "classname" *.jar
дає назву банку
find . -name "*.jar" -exec jar -t -f {} \; | grep "classname"
дає вам пакет класу
#!/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
jar -tvf
на unzip -l
.
Щоб знайти банки, які відповідають заданому рядку:
find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;
Я не знав про утиліту, щоб це зробити, коли натрапив на цю проблему, тому написав наступне:
public class Main {
/**
*
*/
private static String CLASS_FILE_TO_FIND =
"class.to.find.Here";
private static List<String> foundIn = new LinkedList<String>();
/**
* @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();
}
}
}
Є також дві різні утиліти, які називаються як "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 та параметрами:
Сподіваюся, що це комусь допоможе.
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
Для пошуку всіх файлів jar у заданому каталозі для певного класу, ви можете зробити це:
ls *.jar | xargs grep -F MyClass
або, навіть простіше,
grep -F MyClass *.jar
Вихід виглядає приблизно так:
Binary file foo.jar matches
Це дуже швидко, тому що опція -F означає пошук виправленої рядка, тому вона не завантажує механізм регулярних виразів для кожного виклику grep. Якщо вам потрібно, ви завжди можете опустити параметр -F і використовувати регулярні вирази.
Я знайшов цей новий спосіб
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 та клас, якщо ви хочете, ви можете дати ls -1 * .jar або ввести xargs за допомогою команди find HTH Someone.
ClassFinder - програма, призначена для вирішення цієї проблеми. Це дозволяє рекурсивно шукати через каталоги та файли jar, щоб знайти всі екземпляри класу, що відповідають шаблону. Він написаний на Java, а не python. Він має приємний графічний інтерфейс, що робить його простим у використанні. І швидко пробігає. Цей випуск попередньо компілюється в баночку для запуску, тому вам не доведеться створювати його з джерела.
Завантажте його тут: ClassFinder 1.0
Перевірте 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: 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, щоб я міг використовувати часткові імена класів і з'ясувати правильний зі списку показаних результатів.
Ім'я класу може бути як простим іменем класу, як "String", так і повністю кваліфікованим іменем, наприклад "java.lang.String"
Щоб додати ще один інструмент ... це дуже простий і корисний інструмент для Windows. Простий файл EXE, який ви натискаєте, дайте йому каталог для пошуку, ім'я класу, і він знайде файл jar, який містить цей клас. Так, це рекурсивно.
Щоб знайти клас у купі папок JARs (та підпапок): https://jarscan.com/
Usage: java -jar jarscan.jar [-help | /?]
[-dir directory name]
[-zip]
[-showProgress]
<-files | -class | -package>
<search string 1> [search string 2]
[search string n]
Help:
-help or /? Displays this message.
-dir The directory to start searching
from default is "."
-zip Also search Zip files
-showProgress Show a running count of files read in
-files or -class Search for a file or Java class
contained in some library.
i.e. HttpServlet
-package Search for a Java package
contained in some library.
i.e. javax.servlet.http
search string The file or package to
search for.
i.e. see examples above
Приклад:
java -jar jarscan.jar -dir C:\Folder\To\Search -showProgress -class GenericServlet
безсоромне самореклама, але ви можете спробувати утиліту, яку я написав: http://sourceforge.net/projects/zfind
Він підтримує найпоширеніші архіви / стислі файли (jar, zip, tar, tar.gz тощо) і на відміну від багатьох інших шукачів jar / zip, підтримує вкладені поштові файли (zip у zip, jar у jar тощо) до необмеженої глибини.
Трохи запізнюємось на вечірку, але все-таки ...
Я використовую JarBrowser, щоб знайти, в якій банці присутній певний клас. У ньому є простий у користуванні графічний інтерфейс, який дозволяє переглядати вміст усіх банок у вибраному шляху.
Наступний сценарій допоможе вам
for file in *.jar
do
# do something on "$file"
echo "$file"
/usr/local/jdk/bin/jar -tvf "$file" | grep '$CLASSNAME'
done
Це добре працює в MinGW (Windows bash Environment) ~ 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 - це утиліта командного рядка для пошуку класів у файлах jar. Я автор утиліти.
Ви можете запускати утиліту, як grepj package.Class my1.jar my2.war my3.ear
Можна надати кілька банок, вух, файли війни. Для розширеного використання використовуйте пошук, щоб надати список банок, які слід шукати.
Перевірте цей плагін на предмет затемнення, який може виконувати ту роботу, яку ви шукаєте.
Ви можете використовувати locate
та grep
:
locate jar | xargs grep 'my.class'
Переконайтеся, що ви працюєте updatedb
перед використанням locate
.