Выборочная упаковка - PullRequest
3 голосов
/ 22 мая 2010

У меня есть мой маленький program.jar, который использует небольшую часть огромного library.jar.

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

Обновление: размер имеет значение.

Ответы [ 3 ]

3 голосов
/ 22 мая 2010

Есть proguard , с плагинами ant и maven. Удаляет неиспользуемый код, по выбору запутывает и сжимает в одну банку.

Proguard уменьшает размер на два фронта

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

Определить, используется ли класс в Java, немного сложно. Статический анализ кода может помочь вам продвинуться далеко вперед, но вам нужно быть немного осторожным при обращении к коду с помощью рефлексии, так как инструмент может не обнаружить этого. Он обрабатывает Class.forName ("xyzFoo"), но ничего более сложного, и вам нужно будет добавить его в файл конфигурации классов, чтобы включить. Возможно, загрузчик классов сгенерирует список классов, которые используются во время выполнения, поэтому это не должно быть трудным.

Возможно, вы захотите изучить схему сжатия pack200 , так как это также может привести к значительному уменьшению размера банки.

2 голосов
/ 22 мая 2010

Вы можете попробовать использовать задачу Ant jar - дополнительную информацию можно прочитать здесь.

2 голосов
/ 22 мая 2010

JarJar - это решение на основе муравьев:

http://code.google.com/p/jarjar/

Или, если вы используете Maven, есть плагин Shade:

http://maven.apache.org/plugins/maven-shade-plugin/

...