Список содержимого нескольких файлов JAR - PullRequest
21 голосов
/ 14 октября 2011

Я ищу файл .class внутри группы банок.

jar tf abc.jar 

работает для одного файла. Я пытался

find -name "*.jar" | xargs jar tf

ничего не печатает. Единственное решение, которое я могу придумать, это распаковать все, а затем искать. Есть ли способ лучше? Я на LUnix.

Редактировать : При сканировании многих jar-файлов полезно напечатать имя файла 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

Ответы [ 9 ]

32 голосов
/ 14 октября 2011

Вам нужно передать -n 1 в xargs, чтобы заставить его запускать отдельную команду jar для каждого имени файла, полученного из find:

find -name "*.jar" | xargs -n 1 jar tf

В противном случае xargs 'Командная строка s выглядит как jar tf file1.jar file2.jar..., что имеет значение, отличное от предполагаемого.

Полезный метод отладки - вставка echo перед командой, выполняемой xargs:

find -name "*.jar" | xargs echo jar tf

Это выведет полную команду jar вместо ее выполнения, так что вы сможете увидеть, что с ней не так.

2 голосов
/ 28 сентября 2015

Я столкнулся с подобной ситуацией, когда мне нужно искать класс в списке файлов jar, присутствующих в каталоге. Также я хотел знать, из какого jar-файла принадлежит класс. Я использовал этот фрагмент кода ниже (сценарий оболочки) и оказался полезным. Ниже скрипт выведет список файлов 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

Сценарий оболочки взят из: http://alvinalexander.com/blog/post/java/shell-script-search-search-multiple-jar-files-class-pattern

1 голос
/ 01 апреля 2014

Вот что я использую в 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
1 голос
/ 14 октября 2011

Вы также можете использовать -exec параметр поиска

find . -name "*.jar" -exec jar tf {} \;
0 голосов
/ 28 ноября 2018

Если вы подходите к этому вопросу и вам необходимо извлечь все файлы JAR в среде Windows, перейдите в каталог, в котором вы сохранили все файлы JAR, и сохраните пакетный файл со следующим содержимым:

for /r %%f in (*) do jar -xvf %%f

Запустив пакетный файл, он извлечет каждый файл JAR в каталоге.Единственное, что здесь происходит, это то, что он будет распакован в тот же каталог, где находится файл jar.

0 голосов
/ 03 октября 2018

Найдите jar-файлы и сохраните все классы и члены, сохраненные в текстовом формате.

(for j in $(find -name '*.jar');do echo "--$j --";jar tf $j | grep .class | sed 's#/#.#g' | sed 's/.class/ /g' | xargs -n 1 javap -classpath  $j ; done;) >> classes.txt
0 голосов
/ 18 ноября 2015

Я не вижу необходимости использовать exec, у меня это работало в Cygwin под Windows:

find . -name "*.jar" | while read jarfile; do unzip -l $jarfile | fgrep "foo" ; done 
0 голосов
/ 14 октября 2011

Вы также можете использовать unzip, который работает быстрее, чем jar (опция -l для печати содержимого zip).

Например, небольшой скрипт, который примерно выполняет то, что вы хотите:

#!/bin/bash

for i in $(find . -name "*.jar")
do
    if [ -f $i ]
then
    echo $i
    unzip -l $i | grep $*
fi
done
0 голосов
/ 14 октября 2011

Если вы используете Eclipse, вы можете создать проект и добавить все банки. После этого вы сможете найти класс в любой банке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...