Как сжать jar файл

Обновлено: 04.07.2024

Чтобы создать архив или изменить тип архива, выполните несколько шагов:

  • С помощью кнопки "Добавить файлы" укажите каким образом загрузить архив или файл на сервер. Используете "локальный файл" если вам нужно сконвертировать файл с вашего компьютера, для того чтобы указать файл, находящийся в интернете выберите "Онлайн файл" и в появившемся поле вставьте ссылку на файл. Мы не устанавливаем никаких ограничений на размер файлов, но чем больше файл, тем больше времени будет занимать конвертация. Просто наберитесь терпения и все получится. Вы можете сжать любой файл, или преобразовать архив из форматов: APM, ARJ, CHM, cpio, DEB, FLV, JAR, LHA/LZH, LZMA, MSLZ, onepkg, RAR, RPM, smzip, SWF, XAR и Z, а так же распаковку образов дисков: CramFS, DMG, FAT, HFS, ISO, MBR, NTFS, SquashFS, UDF и VHD.
  • Выберите формат архива, в который вы хотите сжать ваш файл. Формат полученного архива может быть 7Z, ZIP, GZIP, BZIP2, XZ, TAR.
  • Для начала конвертации нажмите кнопку "Конвертировать" чтобы начать преобразование. В случае успешной конвертации файл будет доступен в разделе "Результаты конвертации". Если вам нужно просто скачать файл, то кликните на имя файла. Если вы хотите получить другие способы сохранения, то нажмите на значок чтобы сформировать QR-код для загрузки результата на ваш мобильный телефон или планшет, а также если вы хотите сохранить файл в одном из онлайн-сервисов хранения данных, таких как Google Drive или Dropbox.

Пожалуйста, будьте терпеливы в процессе преобразования.

Архивный файл представляет собой файл, который состоит из одного или нескольких файлов, собранных в один с помощью одного из методов сжатия. Архивные файлы используются для сбора данных множества файлов вместе в один файл для более легкой переносимости и хранения, или просто для сжатия файлов, чтобы использовать меньше места для хранения. Архивные файлы чаще всего хранят структуры каталогов, а так же дополнены методами обнаружения ошибок и содержат информацию о корректности данных, так же могут включать произвольные комментарии, а иногда и использовать встроенные функции шифрования (скрывать содержимое архива или производить распаковку файлов по паролю).

Я разрабатываю Java-апплет, и сокращение размера двоичного кода сделает апплет открытым быстрее и улучшит работу пользователя.

Есть ли что-нибудь, что я могу сделать, чтобы уменьшить размер классов и/или jar файлов? Я хочу быть уверенным, что я не пропущу очевидных трюков.

Я знаю, что в параметрах компилятора мира С++ для, например, отключение символов отладки может иметь огромное значение, но я никогда не видел что-то подобное для Java.

ОТВЕТЫ

Ответ 1

Вы можете использовать

чтобы удалить информацию об отладке - я не знаю, сколько разницы она может сделать, хотя.

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

Ответ 2

но резюме здесь:

Сохраняйте код до одного класса. Каждый класс добавляет накладные расходы на запись в файле JAR, а также новый пул констант и список классов.

Держите свои методы как минимум. Каждый метод добавляет служебные данные в файл класса. Все, что вам нужно, это метод main() и методы для реализации подпрограмм клавиатуры и/или мыши.

Не используйте глобальные переменные. Глобальные переменные требуют специальных метаданных в классе для идентификации. Метод-локальные переменные, однако, представляют собой только записи стека и не требуют ничего лишнего.

Используйте хороший компрессор, например 7Zip или KZip, для создания файлов JAR. Утилита JAR в основном предназначена для правильности, а не для коэффициентов сжатия.

Используйте обфускатор, такой как ProGuard, JoGa или JShrink, чтобы оптимизировать размер вашего класса.

Используйте один символ для имени файла класса. Это уменьшает его размер внутри, уменьшает объем информации, хранящейся в программе Zip, и уменьшает размер манифеста.

Укажите как можно меньше классов. Каждый класс, на который вы ссылаетесь, добавляет полный пакет и имя класса, а также подпись метода, которую вы вызываете.

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

Методы, сделанные частными и окончательными, могут быть встроены оптимизатором класса.

Используйте метод String.valueOf() для преобразования примитивов в строки. Например, ""+number расширяется до: new StringBuffer?().append("").append(number).toString() тратит много места на новые ссылки на класс и метод.

Статические строки, поплавки и целые числа, используемые в исходном коде, сохраняются в пуле констант. В результате, чем больше вы можете повторно использовать статическое значение, меньший ваш класс будет.

Вы можете свободно использовать статические конечные переменные для констант. Это сделает ваш код более читаемым, и ProGuard оптимизирует его, поэтому никаких дополнительных накладных расходов нет.

Ответ 3

Proguard - это бесплатный кучер, оптимизатор, obfuscator и preverifier. Он обнаруживает и удаляет неиспользуемые классы, поля, методы и атрибуты. Он оптимизирует байт-код и удаляет неиспользуемые инструкции.

Отчеты о сайте proguard показывают примеры сокращения, варьирующиеся от 19 до 90%.

Ответ 4

Classdepandjar используется в мире Jini для уменьшения размеров файлов jar (Jini отправляет вокруг большого количества удаленного кода, следовательно это требование). Он удаляет классы, на которые не ссылаются внутри той же банки.

Очевидно, что есть исключения из этого (классы, загруженные по имени и т.д.), и поэтому вы можете разместить их в конфиге. Скорее всего, вы должны протестировать свою банку "shaken down", чтобы определить, что релевантные зависимости остаются.

Ответ 5

Некоторые предложения по улучшению размера апплета:

Obfuscate - Proguard был лучшим для меня для всей производительности - более 25% сокращение для меня. Кроме того, он обеспечит достойное сжатие во время Jar.

Оптимизировать любые ресурсы - уменьшать прикрепленные изображения с помощью оптимизаторов изображений, при более низком качестве.

Изменения кода. Я вижу, что вы действительно не хотите этого делать, но стоит взглянуть на ваши файлы Jar и проверить, сколько классов создано. Самый тривиальный класс будет стоить около 500 байт. Если у вас много анонимных внутренних классов, это может стоить рефакторинг.

Загружать ресурсы по мере необходимости. Загрузите исходный апплет. Загрузите дополнительные ресурсы асинхронно после запуска.

Ответ 6

pack200 (и gzip) создает гораздо меньшие файлы, чем банки (фактически zip файлы).

Ответ 7

Ответ 8

Насколько я могу судить, вы не можете стирать символы из файлов классов Java, но вы можете сократить идентификаторы. Однако это, вероятно, сделает бесполезные трассировки стека, поэтому я не защищаю его.

Однако вы можете без потерь уменьшить размер файла, повторно сжимая ваши .jar файлы, используя улучшенные алгоритмы спуска из AdvanceCOMP project (архивы .jar - это просто простые .zip файлы внутри.)

Ответ 9

Вы можете использовать инструмент для применения обфускации кода. Это часто сокращает имена переменных и методов и значительно уменьшает размеры классов. Это часто делается при развертывании кода на платформе J2ME.

Ответ 10

Ответ 11

Если вы используете NetBeans, вы можете установить сборку script для создания сжатого файла JAR в конфигурации проекта (в разделе Build- > Packaging). Возможно, это не так эффективно, как другие решения, но это только флажок.: -)

Узнайте, как архивировать и распаковывать файл, несколько файлов или полный каталог с помощью core Java.

1. Обзор

В этом кратком руководстве мы обсудим, как заархивировать файл в архив и как распаковать архив – все это с помощью основных библиотек, предоставляемых Java.

Эти основные библиотеки являются частью java.util.zip пакет – где мы можем найти все утилиты, связанные с архивированием и распаковкой.

2. Zip-файл

Давайте сначала рассмотрим простую операцию – сжатие одного файла.

Для нашего примера здесь мы заархивируем файл с именем test1.txt в архив с именем compressed.zip .

Конечно, сначала мы получим доступ к файлу с диска – давайте посмотрим:

3. Zip Несколько Файлов

Далее давайте посмотрим, как заархивировать несколько файлов в один zip-файл. Мы будем сжимать test1.txt и test2.txt в multiCompressed.zip :

4. Zip-каталог

Теперь давайте обсудим, как заархивировать весь каталог. Мы будем каталог zipTest в dirCompressed.zip :

Обратите внимание, что:

  • Чтобы заархивировать подкаталоги, мы рекурсивно перебираем их.
  • Каждый раз, когда мы находим каталог, мы добавляем его имя к имени потомков ZipEntry , чтобы сохранить иерархию.
  • Мы также создаем запись в каталоге для каждого пустого каталога

5. Распакуйте архив

Теперь давайте распакуем архив и извлекем его содержимое.

Для этого примера мы распакуем compressed.zip в новую папку с именем unzipTest .

Внутри цикла while , мы переберем каждый ZipEntry и сначала проверим, является ли это каталогом . Если это так, то мы создадим каталог с помощью метода mkdirs () ; в противном случае мы продолжим создание файла:

Здесь следует отметить, что в ветке else мы также сначала проверяем, существует ли родительский каталог файла. Это необходимо для архивов, созданных в Windows, где корневые каталоги не имеют соответствующей записи в zip-файле.

Еще один ключевой момент можно увидеть в методе newFile() :

Этот метод защищает от записи файлов в файловую систему за пределами целевой папки. Эта уязвимость называется Zip Slip, и вы можете подробнее об этом прочитать здесь .

6. Заключение

В этом руководстве показано, как мы можем использовать библиотеки Java для операций архивирования и распаковки файлов.

Чтобы увеличить сервер и сетевую доступность и пропускную способность, два формата сжатия доступны развертыванию Java приложений и апплетов: gzip и Pack200. С обоими методами сжатые файлы JAR передаются по сети, и приложение получения распаковывает и восстанавливает их.

См. Сокращение Времени Загрузки в Учебных руководствах по Java, чтобы создать и развернуть сжатый файл JAR для богатого Интернет-приложения.

Этот раздел описывает технические детали того, как веб-сервер обрабатывает сжатый файл JAR. Следующие темы затрагиваются:

Для получения дополнительной информации о Динамическом Древовидном Демонстрационном апплете, см. Развертывание Апплета в Учебных руководствах по Java.

Accept-Encoding поле определяет то, что может принять клиент, который устанавливается клиентом. Content-Encoding поле указывает на то, что отправляется, который устанавливается сервером. Content-Type поле указывает на то, что должен ожидать клиент, когда преобразование или декодирование будут сделаны.

В этом примере, Accept-Encoding поле устанавливается в pack200-gzip и gzip , указывая к серверу, что приложение (в этом случае, Mozilla Firefox, работающий в Windows 7 с Плагином Java, который идет с JRE 7), может обработать pack200-gzip и gzip форматы.

Сервер ищет требуемый файл JAR с a .pack.gz или .gz расширение файла и отвечает расположенным файлом. Сервер устанавливает заголовок ответа Content-Encoding поле к pack200-gzip , gzip , или NULL в зависимости от типа файла, который отправляется, и дополнительно может установить Content-Type к application/x-java-archive . Поэтому, осматривая Content-Encoding поле, запрашивающее приложение может применить соответствующее преобразование, чтобы восстановить исходный файл JAR.

Пример 1: Приложение, запрашивающее упакованный или сжатый JAR

В Примере 1, клиент запрашивает файл foo.jar с Accept-Encoding поле pack200-gzip,gzip . Сервер ищет файл foo.jar.pack.gz . Если сервер найдет файл, то он отправит файл клиенту и установит Content-Encoding поле к pack200-gzip .

Пример 2: Приложение, запрашивающее упакованный или сжатый JAR

В Примере 2, если файл foo.jar.pack.gz не находится, сервер отвечает файлом foo.jar.gz , если это находится, и устанавливает Content-Encoding поле к gzip .

Пример 3: Приложение, запрашивающее упакованный или сжатый JAR

В Примере 3, если файлы foo.jar.pack.gz и foo.jar.gz не находятся, тогда сервер отвечает файлом foo.jar и любой не устанавливает Content-Encoding поле или наборы это к NULL .

Пример 4: Унаследованное приложение, запрашивающее JAR

Сжатие GZIP

gzip компрессор в свободном доступе, доступный в пределах JRE и SDK как java.util.zip.GZIPInputStream и java.util.zip.GZIPOutputStream .

Можно получить самую высокую степень использования сжатия gzip сжимать несжатый файл JAR против сжатия сжатого файла JAR. Нижняя сторона - то, что файл JAR может храниться несжатый на целевых системах.

  • Используя gzip сжимать файл JAR, который содержит человека выкачанные записи:
    • Notepad.jar : 46.25 Кбит
    • Notepad.jar.gz : 43.00 Кбита
    • Notepad.jar : 987.47 Кбит
    • Notepad.jar.gz : 32.47 Кбита

    Как можно видеть, размер загрузки может быть уменьшен на 14 %, сжимая несжатый файл JAR по сравнению с 3 %, сжимая сжатый файл JAR.

    Сжатие Pack200

    Pack200 сжимает большие файлы очень эффективно, в зависимости от плотности и размера файлов class в файле JAR. Можно ожидать сжатие к одной девятой размер файла JAR, если это будет содержать только файлы class и будет в порядке нескольких мегабайтов.

    Используя ту же самую флягу в предыдущем примере:

    • Notepad.jar : 46.25 Кбит
    • Notepad.jar.pack.gz : 22.58 Кбита

    В этом случае тот же самый файл JAR может быть уменьшен на 50 %.

    Pack200 работает наиболее эффективно над Java файлы class. Это использует несколько методов, чтобы эффективно уменьшить размер файлов JAR:

    • Это объединяет и сортирует данные постоянного пула в файлах class и cо-определяет местоположение их в архиве.
    • Это удаляет избыточные атрибуты class.
    • Это хранит внутренние структуры данных.
    • Это использует кодирование переменной длины и дельта.
    • Это выбирает типы оптимального кодирования для вторичного сжатия.

    Сожмите и распакуйте файлы JAR с интерфейсами командной строки pack200 и unpack200 в bin каталог Вашего SDK или каталог JRE.

    Можно также программно вызвать интерфейсы Pack200; см. java.util.jar.Pack200 .

    Шаги, чтобы Упаковать файл

    1. Рассмотрите размер файла JAR, содержание файла JAR, и пропускную способность Вашей целевой аудитории.

    Все эти факторы играют в выбор метода сжатия. unpack200 инструмент разрабатывается, чтобы быть настолько эффективным насколько возможно, и он занимает время, чтобы восстановить исходный файл. Если у Вас есть большие файлы JAR (2 Мбайта или больше) состоявший главным образом из файлов class, Pack200 является привилегированным методом сжатия. Если у Вас есть большие файлы JAR, которые состоят из файлов ресурсов (JPEG, ДЖИФ, данные, и т.д.), то gzip является привилегированным методом сжатия.

    2. Определите предел сегмента для сжатия Pack200.

    Pack200 загружает весь сжатый файл в память. Однако, когда целевые системы являются памятью и ограниченным ресурсом, устанавливая Pack200.Packer.SEGMENT_LIMIT к нижнему значению уменьшит требования к памяти во время сжатия и несжатия.

    Как особый случай, значение -1 произведет единственный большой сегмент со всеми входными файлами, в то время как значение 0 произведет один сегмент для каждого class. Больший результат сегментов архива на меньшем количестве фрагментации и лучшее сжатие, но обработка их требуют большего количества памяти.

    Значение по умолчанию -1 , что означает pack200 будет всегда создавать единственный выходной файл сегмента. В случаях, где файлы чрезвычайно крупносерийного производства сгенерированы, Вы, строго поощряются использовать сегментацию или разбить входной файл в меньшие JAR.

    Например, JAR на 10 Мбайт, упакованный без этого предела, будет обычно упаковывать приблизительно на 10 % меньший, но pack200 может потребовать большей "кучи" Java (приблизительно десять раз предел сегмента).

    3. Подпишите файлы JAR.

    Pack200 перестраивает содержание получающегося файла JAR. jarsigner инструмент хеширует содержание файла class и хранит хеш в зашифрованном обзоре в декларации. Когда unpack200 распаковывает файл, содержание классов будет перестроено и таким образом лишит законной силы подпись. Поэтому, файл JAR должен быть нормализован, сначала используя pack200 и unpack200 , и после того подписанный.

    Вот то, почему это работает: Любое переупорядочение pack200 делает на любых classfile структурах, идемпотент, таким образом, во второй раз он сжимается, он не изменяет упорядочивания, произведенные первым сжатием. Кроме того, unpack200 гарантируется JSR 200 спецификаций, чтобы произвести определенное изображение bytewise для любого данного упорядочивания передачи элементов архива.

    Например, предположите, что Вы хотите использовать HelloWorld.jar :

    Пересжатие, или перепаковывают, файл, чтобы нормализовать флягу; перепаковывание распаковывает и сжимает файл JAR за один шаг.

    Проверьте справедливый подписанный файл JAR, чтобы гарантировать работавшее подписание.

    Гарантируйте, что файл JAR все еще работает.

    Сожмите файл JAR с pack200 .

    Распакуйте файл с unpack200

    Проверьте файл JAR.

    После проверки можно развернуть сжатый файл пакета HelloWorld.jar.pack.gz ..

    4. Примените методы сокращения

    Pack200 по умолчанию ведет себя в Высоком качестве (Магнитофон) режим, означая, что все исходные атрибуты, существующие в классах так же как атрибутах каждой отдельной записи в файле JAR, сохраняются. Они обычно имеют тенденцию добавлять к упакованному размеру файла; вот некоторые из методов, которые можно использовать, чтобы далее уменьшить размер загрузки:

    Время изменения: Если время изменения отдельных записей в файле JAR не является беспокойством, можно определить опцию Pack200.Packer.MODIFICATION_TIME="LATEST" . Это позволит одному времени изменения быть переданным в файле пакета для каждого сегмента. Последнее время будет последним временем любой записи в пределах того сегмента.

    Подсказка дефляции: Подобный установке времени изменения к "LATEST" , если состояние сжатия отдельных записей в архиве не требуется, установить Pack200.Packer.DEFLATION_HINT="false" . Это незначительно уменьшит размер загрузки, поскольку отдельные подсказки сжатия не будут переданы. Однако, фляга когда реконструировано будет содержать "сохраненные" записи и следовательно может использовать больше дискового пространства на целевой системе.

    Отметьте: вышеупомянутая оптимизация приведет к лучшим результатам с файлом JAR, содержащим тысячи записей.

    Атрибуты: Несколько атрибутов class не требуются, развертывая файлы JAR. Эти атрибуты могут быть разделены из файлов class, значительно уменьшая размер загрузки. Однако, забота должна быть проявлена, чтобы гарантировать, что сохраняются необходимые атрибуты времени выполнения.

    Отладка атрибутов: Если отладочная информация, такая как Номера строки и Исходный файл, не требуется (обычно в трассировках стека приложений), то эти атрибуты могут быть отброшены, определяя Pack200.Packer.STRIP_DEBUG=true. Это обычно уменьшает упакованный файл приблизительно на 10 %.

    5. Обработайте неизвестные атрибуты:

    Разделите атрибут, если атрибут, как считают, избыточен во времени выполнения; это может быть достигнуто, устанавливая свойство Pack200.Packer.UNKNOWN_ATTRIBUTE=STRIP :

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

    Следующее проходит через весь каталог и его содержание,

    Отметьте: подписывая большие файлы JAR, этот шаг может перестать работать с ошибкой безопасности. Вероятной причиной является ошибка 5078608 . Используйте одно из следующих обходных решений:

    • Определить --segment-limit=-1 во время перепаковывания и упаковки.
    • Следуйте за этими перепаковывание и подписание шагов:
      1. pack200 --repack b.jar a.jar
      2. Знак b.jar .
      3. pack200 --repack c.jar b.jar
      4. Знак c.jar .
      5. pack200 out.jar.pack.gz c.jar
      6. Развернуться out.jar.pack.gz .

    6. Используйте в своих интересах Pack200 в своей программе установки

    Можно хотеть использовать в своих интересах технологию Pack200 в своей программе установки, посредством чего файлам JAR продукта, возможно, понадобится к сжатому использованию Pack200 и несжатый во время установки. Если JRE или SDK связываются в установке, Вы свободны использовать unpack200 (Unix) или unpack200.exe (Windows) инструмент в распределении bin каталог. Эта реализация является чистым приложением C++, не требующим, чтобы никакая Среда выполнения Java присутствовала для этого, чтобы работать.

    Windows: Установщики могут использовать лучший алгоритм чем тот в GZIP, чтобы сжать записи. В таких случаях каждый получит лучшее сжатие, используя внутреннее сжатие Установщика, при использовании pack200 инструмент следующим образом:

    Это будет препятствовать тому, чтобы выходной файл был сжатым gzip.

    unpack200 консольное приложение Windows; то есть это выведет на экран окно MS-DOS во время установки. Чтобы подавить это, используйте средство запуска с a WinMain , который подавит это окно, как показано ниже.

    Тестирование

    Требуется, что все файлы JAR, сжали и распаковали, быть протестированными на правильность с Вашими приложениями тестируют спецификаторы. При использовании интерфейса командной строки pack200 , выходной файл будет сжат, используя gzip со значениями по умолчанию. Пользователь может создать простой файл пакета и использование сжатия gzip с определенными пользователем опциями или использующий некоторый другой компрессор.

    Больше информации

    Для получения дополнительной информации см. pack200 и unpack200 в Инструментах Развертывания Java.

    Обновления в Java Standard Edition 6

    В Java SE 6, Java был обновлен формат файла class. Для получения дополнительной информации см. JSR 202: Обновление Спецификации Файла Класса Java . Из-за JSR 202, механизм Pack200 должен быть обновлен соответственно по следующим причинам:

    • Выровняйте с новым форматом файла class для Java SE 6
    • Гарантируйте, что Java SE 6 файлов class сжимается эффективно.

    Сохранить изменения минимальными и без шва для пользователей, pack200 генерирует соответственно имеющие версию файлы пакета, основанные на версии ввода файлы class.

    Также, чтобы поддержать обратную совместимость, если входные файлы JAR исключительно состоят из JDK 1.5 или более старых файлов class, 1.5 совместимых файла пакета производятся. Иначе Java SE 6 совместимых файлов Pack200 производится. Для получения дополнительной информации обратитесь к pack200 страница справочника.

    Обновления в Java Standard Edition 8

    В Java SE 8, Java формат файла class был обновлен из-за JSR 292 , Поддержка виртуальной машины Java Языков не-Java . Следовательно, механизм Pack200 был обновлен соответственно, чтобы гарантировать, что Java SE 8 файлов class сжимается эффективно. В частности механизм Pack200 теперь распознает постоянные записи пула и новые байт-коды, представленные JSR 292.

    В результате сжатые файлы, создаваемые с этой версией pack200 не будет совместимым с более старыми версиями unpack200 .

    Вообще, если сжатый файл будет содержать Java SE 8 или Java SE 7 файлов class, то это не будет совместимым с неупаковщиками старшего возраста. (Например, если сжатый файл будет содержать Java SE 7 файлов class, то это не будет совместимым с неупаковщиками от Java SE 6 или ранее.)

    Читайте также: