Используя Терминал, чтобы открыть файл в файле jar?

Как я могу открыть и посмотреть в файле внутри файла jar из Терминала?

Я могу использовать меньше, чтобы распечатать все файлы в файле jar, но как я могу открыть эти файлы? [ 111]

6
задан 10 January 2013 в 09:06

4 ответа

Лично я использую jar, потому что он кажется более естественным и позволяет выполнять другие операции, такие как обновление содержимого. Вот команды чтения:

Список содержимого

jar tf myjar.jar

Извлечение содержимого в pwd

jar xf myjar.jar

Извлечение конкретного файл, создавая каталоги по мере необходимости

jar xf myjar.jar /foo/bar.class

Извлечение самого байт-кода обычно не очень полезно, хотя. Чтобы понять это, вам нужно декомпилировать его во что-нибудь читабельное.

Не так много хороших Java-декомпиляторов на выбор. Я склонен использовать JD-GUI , потому что он быстрый и делает то, что мне нужно. К сожалению, его функция поиска по нескольким файлам никогда не работает для меня (обратите внимание, что Ctrl + F поиск на странице в порядке). Это не большая потеря, хотя; Вы можете получить его для сброса всех исходных файлов на диск с помощью Ctrl + Alt + S для прочтения с помощью grep / vim / Eclipse и т. д.

Я устанавливаю его так:

wget http://jd.benow.ca/jd-gui/downloads/jd-gui-0.3.5.linux.i686.tar.gz
tar xzf jd-gui-0.3.5.linux.i686.tar.gz
sudo mv jd-gui /usr/local/bin/
sudo chown root:root /usr/local/bin/jd-gui
sudo chmod 755 /usr/local/bin/jd-gui

Использование этого происходит примерно так:

jd-gui myjar.jar
Ctrl+Alt+S; pick your path & save
Alt+F4
jar xf <path>/myjar.src.zip 

Обратите внимание, что JD-GUI не имеет интерфейса CLI. Если вам известен хороший декомпилятор CLI, мне было бы очень интересно услышать об этом (есть JAD, но AFAIK, который поддерживает только Java < 1.5).

0
ответ дан 10 January 2013 в 09:06

Используя unzip, вы можете передать файл из архива в stdout, а затем во что-то другое, чтобы прочитать его, например:

unzip -p /path/to/some.jar path/to/file/inside/jar | less

Из памяти unzip не устанавливается по умолчанию, поэтому вам может потребоваться: [ 113]

sudo apt-get install unzip

Джефф

0
ответ дан 10 January 2013 в 09:06

(Нет точек повторения, поэтому нужно отвечать, чтобы отвечать на комментарии @Kurro)

unzip (-p | -c) <jar-file> <file-in-jar>

Опции -p и -c извлекают файл в стандартный вывод; -c дает дополнительные 2 строки данных в начале (какой файл JAR и какой файл в архиве).

Я нашел это чрезвычайно удобным для чтения файла манифеста или файлов .xml. Для скомпилированных файлов .class это бесполезно, но ваш друг здесь javap:

javap -classpath <jar-file> <fully.qualified.class.name>    # without the .class suffix

Некоторые полезные опции: -c (декомпилировать в Java Assembly), -private также показать приватные поля и -verbose для дополнительной информации. Если это большой файл, вы можете направить вывод через less.

0
ответ дан 10 January 2013 в 09:06

jar-файлы на самом деле являются только zip-файлами, которые вы можете проверить, выполнив.

file foo.jar

, чтобы перечислить файлы, которые вы можете просто сделать.

unzip -l foo.jar

Для доступа к файлам просто распакуйте файл с помощью

unzip foo.jar

Если вы хотите извлечь только один файл, добавьте файлы после

unzip foo.jar some/path/in/jar/bar.class

Убедитесь, что вы используете полный путь от -l. И имейте в виду, что это создаст тот же путь локально.

0
ответ дан 10 January 2013 в 09:06

Другие вопросы по тегам:

Похожие вопросы: