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

6
Camilo Díaz Repka 24 Янв 2009 в 07:44

4 ответа

Лучший ответ

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

  • на основе конфигурации XML (например, Spring);
  • загружается из файлов свойств (например, имени драйвера JDBC);
  • добавляется динамически с аннотациями;
  • загружается в результате внешнего ввода (например, пользовательского ввода, данных из базы данных или удаленного вызова процедуры);
  • и т.п.

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

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

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

Лично я считаю, что помимо того, что IDE вам скажет, мало пользы: удаление неиспользуемых JAR-файлов. Более детальный подход - это просто напрашиваться на неприятности с минимальной или нулевой выгодой.

9
cletus 24 Янв 2009 в 07:55
1
Что, если мы не загружаем классы динамически? Другими словами, никаких конфигураций XML, файлов свойств, аннотаций, rpc и прочего. Тогда можно ли гарантировать работу такого инструмента?
 – 
Pacerier
13 Июн 2014 в 15:02
Проблема остановки исключает только гарантированно правильные ответы да / нет на «нетривиальные» свойства. Мы можем избежать HP, разрешив неправильные ответы (ложные срабатывания / отрицания); или разрешив дополнительный «неизвестный» ответ; или сделав его "тривиальным" (например, появляются ли определенные ключевые слова где-либо в программе)
 – 
Warbo
30 Окт 2020 в 17:42

Да, вам нужен ProGuard. Это полностью бесплатный инструмент для сжатия и обфускации кода Java. Настроить легко, быстро и эффективно.

4
Lawrence Dol 24 Янв 2009 в 09:08
2
Просто убедитесь, что вы предоставили правильный список «корневых» классов, в которых будет производиться поиск ссылок, и что вы не забыли ни одного класса, который вы используете путем отражения.
 – 
Peter Štibraný
24 Янв 2009 в 13:06

Вы можете попробовать JarJar http://code.google.com/p/jarjar/

Он обрезает зависимости jar.

3
Ruggs 24 Янв 2009 в 08:00
В частности, создайте толстую банку и банку только с вашим кодом. Используя 'java -jar jarjar.jar, найдите class code.jar fat.jar', который перечислит ваши зависимости. На основе этого вы можете создать файл правил из операторов «сохранить», а затем преобразовать вашу толстую банку в свернутую.
 – 
Lanny Ripple
9 Дек 2015 в 20:13

В большинстве случаев вы можете сделать это довольно легко, используя только javac.

Удалите существующие файлы классов. Вызовите javac с именем ваших входных классов. Он скомпилирует необходимые классы, но не более того. Работа сделана.

0
Tom Hawtin - tackline 24 Янв 2009 в 14:58
Я думаю, что OP имел в виду библиотеки, а также ваши собственные классы
 – 
Chii
24 Янв 2009 в 15:34