Генерировать минимизированную банку только с использованием используемых классов
Мне нужно создать минимальную библиотеку 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:)
Может быть, это будет полезно.
Также вы можете собирать использованные классы библиотеки под специальной библиотекой и включать эту созданную пользователем библиотеку в проект.