2010-03-03 2 views
5

В нашем приложении в процессе разработки большого количества файлов JAR был собран. Как я могу отфильтровать те, которые больше не используются приложением? На каком-то простом пути?Как узнать, какое приложение JAR не используется?

+0

Хороший вопрос. Я также хотел бы знать это :) – Alfred

+0

Я думаю, что это один из самых больших недостатков java, тот факт, что динамические зависимости невозможно скрыть 100%. – karoberts

ответ

3

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

while (<>) { 
    $l{$1}++ if m/\s+from\s+(.+\.jar)/; 
} 

for $l (keys(%l)) { 
    print "$l\n"; 
} 

(позволяет назвать его list_jars.pl) и кормить его выход в многословной перспективе:

java -verbose -jar YOUR_APP.jar | perl list_jars.pl 

, который должен перечислить все источники загруженных классов.

+0

теперь это действительно опрятный трюк – radai

+0

Что делать, если у меня есть архив веб-приложений (война)? – Trick

+0

Perl-скрипт анализирует исчерпывающий вывод загрузчика класса, для веб-приложения вы можете добавить -verbose к параметрам запуска и проанализировать результирующий стандартный вывод журнала. (Это, вероятно, будет отображать банки, которые также используются контейнером сервлетов.) – rsp

0

Напишите сценарий, который удаляет их по одному из пути сборки, компилирует проект и проверяет наличие ошибок сборки. Сценарий собрал список неиспользуемых банок. Должно быть легко писать в bash/python.

Это решение не может отслеживать зависимости от времени выполнения на основе отражения (см. Мой комментарий ниже).

+2

. Это найдет ошибки во время компиляции, но не ошибки, которые возникают во время выполнения из отказы отложенной загрузки класса. Особенно в сложных рамках такие вещи довольно распространены. Хуже того, когда структура выбирает один доступный класс для определенного интерфейса, а поведение немного отличается в зависимости от того, какая реализация фактически используется. Я настоятельно рекомендую запустить полный интеграционный тест после того, как вы считаете, что все готово. –

+0

Вы правы, это решение не обрабатывает этот случай. Но я думаю, что это невозможно сделать автоматически, если вы используете какое-то продвинутое отражение. Что бы вы сделали, извлеките все строки кода, которые могут соответствовать имени класса:>? – pajton

+0

Вы также можете сделать это через Eclipse IDE, удалив элементы из .classpath по одному и перестроив проект. Когда материал становится красным, вы удалили тот, который используется. ;-) –

1

Если вы используете maven, для этого есть mojo: mvn dependency: проанализируйте , если нет, я не знаю ни одного простого способа. жесткий способ включал бы байт-код анализа всех скомпилированных классов вашего проекта для проверки импорта ...

+0

и подумать об этом, даже если не поймать отражение ... – radai

+0

Нет ... Но maven будет улавливать зависимости, объявленные в pom.xml, но не очевидные в коде (например, фреймворки и динамически загружаемые драйверы.) –

0

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

1

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

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

Смежные вопросы