2010-09-28 3 views
11

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

Каков наилучший способ уменьшить размеры банки. Должен ли я загружать источники и строить банку только с теми классами, которые мне нужны? Какие существующие инструменты могут помочь автоматизировать это (например, я кратко рассмотрел http://code.google.com/p/jarjar/)?

Спасибо

Edit 1: Я хотел бы, чтобы снизить размер моей третьей стороны баночки 'официальной' как swingx-1.6.jar (1,4 Мб), набор-3,6 (1,7 MB) glazedlists -1.8.jar (820kB) и т.д., так что они содержат только голые минимальные классы мне нужно

Edit 2: Минимизация баночку вручную или с помощью программы, как ProGuard дополнительно усложняется, если библиотека использует отражение. Injection with google guice does not work anymore after obfuscation with proguard

Ответ на Клетуса на другой пост очень хороший How to determine which classes are used by a Java program?

ответ

5

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

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

+0

Я использовал Proguard для обфускации моего приложения с хорошим результатом и заметил меньший размер вывода. Я также столкнулся с проблемами с «сломанными классами», как вы упоминаете, с объектами xstream, пока я не добавил их в раздел «сохранить». Я не использовал proguard, чтобы уменьшить размер моих банок зависимости, хотя - возможно ли это? –

+0

@brian_d - да, это должно быть возможно, используя -injars/-outjars. Я думаю, что «уровень сложности» будет связан с количеством банок, которые у вас есть. В качестве примера я использовал шифрование bouncycastle. Я смог просто включить классы, которые мне нужны, отбросить весь код для неиспользуемых алгоритмов и т. Д. –

+0

спасибо за предложение, я попробую. –

0

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

+0

Все еще проблематично, как упоминалось в моем «Редактировании № 2». Я уменьшил swingx вручную от 1.4MB до 160kB. Он построил отлично, но разбился на работу из-за нескольких вызовов класса метода отражения, которые не были включены. –

0

Вы можете добавить GenJar в качестве задачи Ant и использовать его для создания JAR. Как говорится на домашней странице библиотеки,

GenJar является специализированным Ant задачей, которая строит файлы банка на основе класса зависимостей, а не просто содержимого каталога.

Вы можете найти его на SourceForge.

+1

Я получаю только разочарование GenJar, с ошибками «Невозможно решить».Похоже, что он не обновлялся с 2003-03-06. –

+0

Я обнаружил, что GenJar Не удалось решить проблемы, ушел, когда я использовал Java 7 вместо Java 8 – Jon

Смежные вопросы