Можно ли упаковать все зависимости jar в один большой jar? - PullRequest
14 голосов
/ 29 июня 2009

Я знаю, что это не "лучшая практика", но могу ли я включить все зависимости в одну большую банку?

Ответы [ 11 ]

16 голосов
/ 09 марта 2010

Мне кажется, что называть выступление One-Jar ужасным и плохим - несправедливо. Для приложений среднего размера можно ожидать, что запуск займет пару секунд дольше (хотя это не влияет на заставку JVM). Объем памяти, превышающий десятки мегабайт, незначителен для большинства сред, за исключением, возможно, встроенных систем. Кроме того, One-Jar способен автоматически извлекать некоторые файлы в файловую систему, что избавляет от необходимости разрабатывать установщик в моем случае.

Ниже приведена попытка количественно оценить влияние производительности, представленное One-Jar для моего приложения. Это приложение с графическим интерфейсом на основе Swing, состоит из 352 классов, скрытых с помощью ProGuard 4.5b2. One-Jar 0.96 используется для объединения результирующих классов с библиотеками объемом 12 МБ (ODFDOM, Saxon HE, Xerces, Jaxen, VLDocking, Apache Commons и т. Д.). Я сравнил производительность запутанной банки с той же самой банкой, обработанной One-Jar.

  • От JVM до начала метода main (): 0,5 с без One-Jar и 1,7 с с One-Jar. От JVM начните до появления окна приложения на экране: 2.3 с без One-Jar и 3.4 с с One-Jar. Таким образом, One-Jar добавляет 1.1s ко времени запуска.
  • One-Jar не увеличит задержку между запуском JVM и заставкой, появляющейся на экране (если реализовано через манифест jar), поэтому увеличение времени запуска не слишком раздражает для интерактивных приложений.
  • Мы говорим о загрузчике классов, поэтому это не должно влиять на скорость выполнения кода, если вы не используете интенсивную загрузку классов.
  • Просмотр статистики JVM (через jconsole) показывает, что версия One-Jar'red занимает больше динамической памяти. Для моего приложения накладные расходы составляют порядка десятков МБ. Я видел такие цифры, как 16 МБ против 40 МБ, 306 МБ против 346 МБ, 131 МБ против 138 МБ, в зависимости от того, сколько пользовательских данных обрабатывается приложением, а теперь уже давно запущен сборщик мусора.

Приведенное выше время было получено путем взятия временной метки непосредственно перед запуском JVM из оболочки Linux, в начале метода main () и в обработчике события windowOpened () моего окна приложения. Измерения проводились на не очень быстром ноутбуке D820 с двухъядерным процессором 1 ГГц и 2 ГБ или ОЗУ под управлением Ubuntu 8.04.

Надеюсь, это поможет.

13 голосов
/ 29 июня 2009

Я использовал плагин сборки maven с jar-with-зависимости дескриптор

9 голосов
/ 29 июня 2009

Использование старого доброго муравья: просто используйте zipgroupfileset с муравьем Zip task

<zip destfile="out.jar">
    <zipgroupfileset dir="lib" includes="*.jar"/>
</zip>

Это сгладит содержимое всех включенных jar-библиотек.

6 голосов
/ 18 июля 2010

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

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

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

5 голосов
/ 29 июня 2009

Если вы хотите сделать это, есть инструмент под названием Jar Jar Links , который сделает это за вас. Никогда не использовал его, но трудно забыть имя.

2 голосов
/ 30 июня 2009

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

2 голосов
/ 29 июня 2009

Eclipse 3.4 и выше позволяет вам сделать это. Щелкните правой кнопкой мыши свой проект, выберите «Извлечь» и перейдите к параметру «Runnable Jar». Выберите Далее. Выберите подходящие настройки и выключите и работайте. Также я напоминаю, что эта функциональность достигается с помощью тех же или похожих библиотек, которые использует FatJar (упомянутый выше).

2 голосов
/ 29 июня 2009
  • Вы можете разархивировать файлы и перепаковать их с помощью командной строки

  • Вы можете использовать [uberjar]

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

2 голосов
/ 29 июня 2009

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

2 голосов
/ 29 июня 2009

Часто вы можете, но иногда есть необычные юридические или технические причины не делать этого.

  • Legal: Например, мы обнаружили, что в то время, когда мы этого хотели, мы не могли объединить jar-файлы JavaMail в один большой пакет с остальной частью нашего приложения, но с лицензией Соглашение гласило, что мы должны держать их отдельно.

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

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

...