Генерировать минимизированную банку только с использованием используемых классов

Мне нужно создать минимальную библиотеку utils для использования в Android. Я использую некоторые методы из общих библиотек apache (например, IOUtils, StringUtils). Тем не менее, каждое такое использование заставляет меня импортировать всю библиотеку (commons-lang, commons-io и т.д.), Что абсолютно приемлемо при Tomcat (war все равно размер mamoot), но абсолютно неприемлемый для Android-проекта.

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

Итак, пожалуйста, знаете ли вы, что плагин maven будет выполнять такую ​​минимизацию зависимостей или любой автономный инструмент, который будет делать то же самое?

Ответ 1

Простите, может быть, я не ясно понял вопрос. Инструмент обфускатора (т.е. ProGuard) мог бы это сделать, не так ли? Он объединяет несколько JAR в один и разбивает неиспользуемые классы. Если вам не нужна обфускация/оптимизация (чтобы предотвратить нежелательные побочные эффекты), вы можете отключить их, оставив фазу "усадки" включенной.

Ответ 2

Плагин maven, который вы не можете запомнить, вероятно, Apache Maven Shade Plugin, есть опция minimizeJar. Как заметил Andreas_D, это не будет включать классы, загруженные с помощью Class.forName, поэтому вам нужно implicity сказать в конфигурации, что они вам нужны, Вот как я сделал maven для включения драйвера jdbc в мою единственную банку:

<filter>
  <artifact>net.sourceforge.jtds:jtds</artifact>
    <includes>
      <include>**</include>
    </includes>
</filter>

Ответ 3

В общем случае невозможно автоматически выбрать все классы, используемые приложением. Просто подумайте о том, что мы можем сделать с Class.forName(String name), или если мы используем контейнер инъекции зависимостей и объявляем типы во внешних файлах конфигурации.

Ответ 4

Я думаю, если вы используете Eclipse для JAR проекта, он дает некоторые варианты для этого, а JARing:) Может быть, это будет полезно.

Также вы можете собирать использованные классы библиотеки под специальной библиотекой и включать эту созданную пользователем библиотеку в проект.