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

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

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

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

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

============================== Вопросы ========= =============================

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

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

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

Ответ 1

A1:

Вы можете создать ant script или использовать Eclipse или любую другую среду IDE для автоматической упаковки вашего апплета. Но ваш путь тоже правильный.

A2:

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

A3:

Это очень распространено. Несколько советов:

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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


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