Задача Ant сохранить только определенные классы в JAR - с проверкой зависимостей? - PullRequest
4 голосов
/ 01 марта 2012

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

Например, у меня есть JAR, содержащий классы A, B, C и D, где A и B оба расширяют C. D не зависит от других.Я хотел бы указать для задачи Ant, что мне нужен только класс B, и получить файл JAR, содержащий только B и C.

Я видел этот ответ который предоставляет простой способ сказать «Я не хочу A и D», и я полагаю, что замена «исключает» на «включает» позволила бы мне указать «Я хочу B и C» следующим образом:

<jar destfile="stripped.jar">
    <zipfileset src="full.jar" includes="path/B.class;path/C.class"/>
</jar>

... но есть ли способ сделать это с учетом зависимостей, чтобы я мог сказать «Я хочу B», но в итоге получился JAR, содержащий B и его зависимости?

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Поскольку user829876 предлагает , ProGuard может быть одним из вариантов.

Другой вариант, который может быть ближе к тому, что вы ищете, это GenJar . В течение нескольких лет не было особой активности, но похоже, что она будет делать то, что вам нужно. Вы можете найти несколько примеров здесь . Существует не очень много альтернатив .

Еще один инструмент, который вам может понадобиться - Autojar . Похоже, что у нее нет задачи Ant, но вы можете использовать задачу Java , чтобы запустить ее.

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

3 голосов
/ 02 марта 2012

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

Например, вы можете использовать ProGuard .

Из документации:

ProGuard - это бесплатный инструмент для сжатия файлов класса Java, оптимизатор, обфускатор и предварительный тестер. Он обнаруживает и удаляет неиспользуемые классы, поля, методы и атрибуты. Он оптимизирует байт-код и удаляет неиспользуемые инструкции. Переименовывает остальные классы, поля и методы, используя короткие бессмысленные имена. Наконец, он предварительно проверяет обработанный код для Java 6 или для Java Micro Edition.

Вы можете настроить его, чтобы сделать только шаг сжатия. В вашем случае вы бы использовали опцию -keep, чтобы сообщить ProGuard, что вам нужен класс B, и в итоге получите B и C, как вы описываете. Однако это может быть не совсем то, что вам нужно, поскольку ProGuard также удалит неиспользуемые методы и тому подобное, изменяя классы в вашем JAR-файле (я не знаю какой-либо опции, чтобы отключить это). Кроме того, вы должны указать ProGuard не делать никаких других вещей, которые он обычно делает, таких как запутывание.

Если ProGuard не соответствует вашим потребностям, вы можете искать другие средства для запутывания и / или сжатия. Надеюсь, это поможет, и удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...