Как мне убрать пух из сторонней библиотеки? - PullRequest
4 голосов
/ 01 сентября 2008

Возможно, это не лучшая практика, но есть способы удаления неподдерживаемых классов из jar-файлов сторонних производителей. Что-то, что смотрит на то, как мои классы используют библиотеку, и выполняет какой-то анализ покрытия, затем выплевывает еще одну банку со всеми нетронутыми удаленными классами.

Очевидно, есть проблемы с этим. В частности, сценарий использования, который я описал, может не использовать все классы постоянно.

Но пренебрегая этими проблемами, можно ли это сделать в принципе?

Ответы [ 7 ]

8 голосов
/ 02 сентября 2008

Есть способ.

Проект JarJar делает это AFAIR. Первая цель проекта JarJar - позволить встраивать сторонние библиотеки в свой собственный jar, при необходимости изменяя структуру пакета. Это может убрать ненужные классы.

Проверьте это на http://code.google.com/p/jarjar/.

Вот ссылка на термоусадочные банки: http://sixlegs.com/blog/java/jarjar-keep.html

2 голосов
/ 24 ноября 2009

Я использую ProGuard для этого. Помимо того, что это отличный обфускатор, он имеет фазу сжатия кода, которая может объединять несколько JAR-файлов, а затем удалять любые неиспользуемые классы или члены класса. Это делает отлично работу при сжатии.

2 голосов
/ 02 сентября 2008

В Ant есть инструмент, который называется classfileset. Вы указываете список корневых классов, которые, как вам известно, вам нужны, а затем набор классов файлов рекурсивно анализирует их код, чтобы найти все зависимости.

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

1 голос
/ 01 сентября 2008

На предыдущей работе я использовал обфускатор Java, который, как и запутывание кода, также удалял классы и методы, которые не использовались. Если вы выполняли «Class.byName» или любой другой тип рефлексии, вам нужно было сообщить обфускатору, потому что он не мог определить, проверяя код, какие классы или методы вызваны рефлексией.

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

0 голосов
/ 02 сентября 2008

Это был бы интересный проект (кто-нибудь уже делал это?)

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

0 голосов
/ 01 сентября 2008

Добавление к этому вопросу, может ли это улучшить производительность? Поскольку неиспользуемые классы не будут JIT-скомпилированными, улучшая время запуска, или java автоматически обнаруживает это при компиляции в байт-код и даже не обрабатывает код, который не используется?

0 голосов
/ 01 сентября 2008

jar - это просто zip-файл, так что я думаю, вы можете. Если бы вы могли добраться до источника, он чище. Может быть, попытаться разобрать класс?

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