Список содержимого нескольких файлов jar
Я ищу файл .class внутри кучи баннеров.
jar tf abc.jar
работает для одного файла. Я попробовал
find -name "*.jar" | xargs jar tf
ничего не печатает. Единственное решение, о котором я могу думать, - это распаковать все, а затем искать. Есть ли способ лучше? Я нахожусь в LUnix.
Edit:
При сканировании многих банок полезно печатать имя файла jar вместе с классом. Этот метод работает хорошо:
find . | grep jar$ | while read fname; do jar tf $fname | grep SchemaBuilder && echo $fname; done
Полученный результат выборки:
1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class
1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class
42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class
./XmlSchema-1.3.2.jar
1572 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$1.class
1718 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder$2.class
42607 Wed Jul 25 10:20:18 EDT 2007 org/apache/ws/commons/schema/SchemaBuilder.class
./XmlSchema.jar
Ответы
Ответ 1
Вам нужно передать -n 1
в xargs
, чтобы заставить его запустить отдельную команду jar
для каждого имени файла, которое она получает из find
:
find -name "*.jar" | xargs -n 1 jar tf
В противном случае строка командной строки xargs
выглядит как jar tf file1.jar file2.jar...
, которая имеет другое значение для предполагаемого.
Полезная методика отладки заключается в том, чтобы придерживаться echo
перед командой, которую должен выполнять xargs
:
find -name "*.jar" | xargs echo jar tf
Это выведет полную команду jar
вместо ее выполнения, чтобы вы могли увидеть, что с ней не так.
Ответ 2
Вы также можете использовать опцию -exec
для поиска
find . -name "*.jar" -exec jar tf {} \;
Ответ 3
Вот что я использую в Cygwin. Он поддерживает заголовки разделов на каждый файл jar, как указано выше.
find . -name "*.jar" \
-exec echo ======\ {}\ ====== \; \
-exec /c/Program\ Files/Java/jdk1.7.0_45/bin/jar.exe tf {} \; | less
Для * nix отбросьте ".exe":
find . -name "*.jar" \
-exec echo ======\ {}\ ====== \; \
-exec jar tf {} \; | less
Ответ 4
Я столкнулся с аналогичной ситуацией, когда мне нужно найти класс в списке файлов jar, присутствующих в каталоге. Также я хотел знать, из какого файла jar принадлежит класс. Я использовал этот ниже фрагмент кода (shell script) и обнаружил, что он полезен. Ниже script будет отображаться список файлов jar, содержащий класс для поиска.
#!/bin/sh
LOOK_FOR="codehaus/xfire/spring"
for i in `find . -name "*jar"`
do
echo "Looking in $i ..."
jar tvf $i | grep $LOOK_FOR > /dev/null
if [ $? == 0 ]
then
echo "==> Found \"$LOOK_FOR\" in $i"
fi
done
Shell script взято из:
http://alvinalexander.com/blog/post/java/shell-script-search-search-multiple-jar-files-class-pattern
Ответ 5
Вы также можете использовать unzip, который быстрее, чем jar (-l для печати zip-контента).
Например, небольшой script, который делает примерно то, что вы хотите:
#!/bin/bash
for i in $(find . -name "*.jar")
do
if [ -f $i ]
then
echo $i
unzip -l $i | grep $*
fi
done
Ответ 6
Я не вижу необходимости использовать exec, это сработало для меня в Cygwin в Windows:
find . -name "*.jar" | while read jarfile; do unzip -l $jarfile | fgrep "foo" ; done
Ответ 7
Если вы используете Eclipse, вы можете создать проект и добавить все банки. Затем вы сможете найти класс в любой из банок.