Java - как уменьшить размер сторонних банок, чтобы уменьшить размер вашего приложения

Я развиваю веб-приложение java и что включает в себя апплет. Этот апплет зависит от двух файлов jar:

  • JFreeChart (для построения графиков на стороне клиента) - 1.7 mb(размер jar file)
  • MySqlJdbcConnector (для хранения данных, захваченных на стороне клиента, к удаленная база данных) - .7 Мб (размер jar file)

теперь проблема заключается в размере выше два файла jar. Общий размер моего апплет jar (myApplet.jar) is 2.5 mb из которых 2.4 Мб is из-за вышеуказанных двух файлов jar.

Я не использую все классы в эти файлы jar. В частности, для jfreechart, Я использую очень небольшое количество занятий от этого библиотека.

==============================вопросы======================================

Q1. для создания myApplet.Джар файл, что я сделал, это я распаковал оба файла jar (jfreechart и mySQLJdbcConnector), а затем упаковал распакованную версию файлов jar с исходным кодом моего кода апплета, чтобы создать один файл jar (i.e myApplet.сосуд.) это правильный путь упаковка сторонних файлов jar с кодом апплета? Есть ли способ оптимизировать это?

Q2. Я попытался найти зависимости классов библиотеки jfreechart, которые я использую в своем приложении, чтобы упаковать только эти зависимости в myApplet.сосуд. для этой цели, я использовал DependencyAnalyzer чтобы найти зависимости всех классов. Но позже мне было трудно сделать это вручную, потому что каждый класс (класс jfreechart, который я использую в своем приложении) имеет много зависимостей, и я использую около 15 классов jfreechart, поэтому сделать это для каждого класса будет очень сложно. Есть предложения по этому поводу?

Q3. Это очень распространенная ситуация, с которой сталкиваются разработчики, или мне чего-то не хватает, из-за чего я должен это сделать?

3 ответов


А1:

вы можете создать сценарий ant или использовать Eclipse или любую другую среду IDE для автоматической упаковки апплета. Но твой путь тоже верен!--3-->

А2:

Я бы не делал эти вещи вручную. Поиск транзитивных зависимостей очень сложен. Может быть!--7-->dariooответ-лучший способ сделать это.

A3:

Это действительно очень распространенная. Несколько подсказок:

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

С другой стороны, возможно, у вас не должно быть прямого подключения из вашего апплета к базе данных. Вы можете создать интерфейс RMI (или что-то подобное) для передачи данных SQL и результатов на сервер приложений, который фактически выполняет ваш SQL. Это важный аспект безопасности для вашего апплета, если вы не запустите его в безопасной интрасети.


Я бы предложил попробовать ProGuard. Вы можете исключить части файлов jar, которые вы не используете.


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

есть различные инструменты для этого; например, ProGuard, Zelix ClassMaster, плагин Maven, имя которого я забыл и так далее.

однако есть несколько проблем, по крайней мере, в общем случае:

  • Если ваш код использует динамическую нагрузку (например, путем вызова Class.forName(className)), эти инструменты, как правило, не может определите зависимость. Поэтому, чтобы избежать динамической загрузки классов, оставленных за пределами final JAR, вам нужно сообщить инструменту имена всех классов, которые ваше приложение может явно загрузить таким образом.

  • вам нужно взглянуть на лицензию сторонней библиотеки. IIRC, некоторые лицензии требуют включения библиотеки в распределенные артефакты таким образом, чтобы люди могли заменить другую версию библиотеки. Можно утверждать, что uber-JAR делает это трудно сделать, и поэтому может быть проблематичным.

JFreeChart является LGPL, и LGPL является лицензией, которая имеет требование выше. Однако MySQL - это GPL, который превосходит LGPL, и это означает, что ваш апплет должен быть GPL'Ed ... если вы его распространите.


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