2010-04-09 15 views
8

Я разработал модуль для Java-проекта. Модуль зависит от внешней библиотеки (fastutil). Проблема в том, что файл fastutil.jar в два раза тяжелее всего самого проекта (14 МБ). Я использую только крошечное подмножество классов из библиотеки. Теперь модуль завершен, и в будущем никто не сможет его продлить. Есть ли способ, которым я мог бы извлечь только соответствующий класс в fastutil_small.jar, чтобы другим не нужно было загружать весь этот лишний вес?Уменьшить размер внешнего файла jar

+0

На самом деле, что вам нужно? – Venkat

+0

Ну, чтобы добавить мой модуль в проект. это несколько относительно небольших пакетов Java. все, что я хочу, это то, что моя зависимость от нескольких классов от «fastutil» не должна увеличивать размер проекта в три раза. –

ответ

8

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

Вы можете использовать только эту функцию и уже получают совсем немного экономии

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

+1

+1 первые 5 слов - это именно то, о чем я думал, так как я читал этот вопрос –

+0

от инструкций proguard: «ProGuard требует, чтобы библиотеки jars (или войн, ушей, почтовых индексов или каталогов) входных банок были указано. Это, по сути, библиотеки, которые вам нужны для компиляции кода. ProGuard использует их для восстановления зависимостей классов, необходимых для правильной обработки. Баки библиотеки всегда остаются неизменными. Вы все равно должны поместить их в путь класса к вашему окончательному приложению ». Но уменьшение размера файлов jar библиотеки - именно то, что я хочу (или я использую неправильный словарь?). Что мне не хватает? –

+0

@joe: вы можете легко обойти это, указав библиотеку через '-injars', а не через' -libraryjars' –

0

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

5

С installation instructions из fastutil:

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

+0

Да, я сделал rtfm :) Я просто не смог ничего с этим сделать (нооб, помните? :)) –

+1

ну, оказывается, все, что я должен был сделать, это попробовать три раза. –

2

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

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