Как я могу открыть и посмотреть в файле внутри файла jar из Терминала?
Я могу использовать меньше, чтобы распечатать все файлы в файле jar, но как я могу открыть эти файлы? [ 111]
Лично я использую 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).
Используя unzip, вы можете передать файл из архива в stdout, а затем во что-то другое, чтобы прочитать его, например:
unzip -p /path/to/some.jar path/to/file/inside/jar | less
Из памяти unzip не устанавливается по умолчанию, поэтому вам может потребоваться: [ 113]
sudo apt-get install unzip
Джефф
(Нет точек повторения, поэтому нужно отвечать, чтобы отвечать на комментарии @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
.
jar-файлы на самом деле являются только zip-файлами, которые вы можете проверить, выполнив.
file foo.jar
, чтобы перечислить файлы, которые вы можете просто сделать.
unzip -l foo.jar
Для доступа к файлам просто распакуйте файл с помощью
unzip foo.jar
Если вы хотите извлечь только один файл, добавьте файлы после
unzip foo.jar some/path/in/jar/bar.class
Убедитесь, что вы используете полный путь от -l. И имейте в виду, что это создаст тот же путь локально.