Java: работа с jar-архивами из консоли Linux

Автор: | 11/27/2013
 

java-logoИзвлечение объектов из архива

Распаковать архив ojdbc14-10.2.0.4.jar в текущую директорию:

$ jar xf ojdbc14-10.2.0.4.jar

Ключи:

-xextract, распаковать;
-ffile, файл, который необходимо распаковать;

В результате получим содержимое архива:

$ ls -1
META-INF
ojdbc14-10.2.0.4.jar
oracle

Извлечь только определённый файл или каталог, например — только папку oracle из архива ojdbc14-10.2.0.4.jar:

$ jar xf ojdbc14-10.2.0.4.jar oracle/
$ ls -1
ojdbc14-10.2.0.4.jar
oracle

Извлечь только определённый файл:

$ jar xf ojdbc14-10.2.0.4.jar oracle/sql/NUMBER.class
$ ls -1 oracle/sql/
NUMBER.class

Необходимые каталоги (в данном случае oracle/sql) будут созданы автоматически.

Создание jar-архива

Ключи:

-vverbose, будет выводить полную информацию о действиях;
-0zero, не будет сжимать файлы перед добавлением в арихв;
-ffile, направить всё в файл;
-ccreate, создать архив;
-Cchange, сменить каталог на время выполнения операции.

Создадим простой архив oracle.jar в который заархивируем содержимое каталога oracle:

$ jar cf oracle.jar oracle/
$ ls -1
oracle
oracle.jar

То же, но в подробном режиме:

$ jar cfv oracle.jar oracle/
[...]
adding: oracle/jpub/(in = 0) (out= 0)(stored 0%)
adding: oracle/jpub/runtime/(in = 0) (out= 0)(stored 0%)
adding: oracle/jpub/runtime/MutableStruct.class(in = 5064) (out= 2242)(deflated 55%)
[...]

Видно, что файлы сжимаются. Избежим этого, добавим -0:

$ jar cfv0 oracle.jar oracle/
[...]
adding: oracle/jpub/(in = 0) (out= 0)(stored 0%)
adding: oracle/jpub/runtime/(in = 0) (out= 0)(stored 0%)
adding: oracle/jpub/runtime/MutableStruct.class(in = 5064) (out= 5064)(stored 0%)
[...]

Видим, что файлы добавляются в архив вместе с директориями. Что бы избежать этого, и файлы размещать в корне архива — используем опцию -C:

$ mkdir or
$ touch or/file.d
$ jar cf or.jar -C or .

Проверим содержимое:

$ jar vtf or.jar | grep file.d
0 Tue Nov 26 18:45:52 EET 2013 file.d

Файл file.d находится в корне архива, т.к. перед выполнением добавления его в архив — архиватор сменил текущую директорию на or.

Просмотр содержимого jar-архива

-ffile, файл архива;
-ttable, список содержимого;
-vverbose, более полная инфомрация.

Пример:

$ jar tf oracle.jar | grep "jpub/runtime"
oracle/jpub/runtime/
oracle/jpub/runtime/MutableStruct.class
oracle/jpub/runtime/Util.class
oracle/jpub/runtime/MutableArray.class

И с опцией -v:

$ jar tfv oracle.jar | grep "jpub/runtime"
0 Sat Feb 02 11:40:08 EET 2008 oracle/jpub/runtime/
5064 Sat Feb 02 11:40:08 EET 2008 oracle/jpub/runtime/MutableStruct.class
4997 Sat Feb 02 11:40:06 EET 2008 oracle/jpub/runtime/Util.class
12315 Sat Feb 02 11:40:06 EET 2008 oracle/jpub/runtime/MutableArray.class

Добавление объектов в jar-архив

-uupdate, обнвоить содержимое архива.

Создадим файл:

$ touch file.f

И добавим его в имеющийся архив oracle.jar:

$ jar uf oracle.jar file.f

Проверим:

$ jar tvf oracle.jar | grep "file.f"
0 Tue Nov 26 18:40:26 EET 2013 file.f

При обновлении архива — так же можно использовать опцию -C (change).

Дополнение

Простой способ найти файл, который находится в каком-то jar-архиве, но вы не знаете в каком именно:

$ find . -name "*.jar" | xargs grep "NUMBER.class"
Binary file ./ojdbc14-10.2.0.4.jar matches