В нашем приложении в процессе разработки большого количества файлов JAR был собран. Как я могу отфильтровать те, которые больше не используются приложением? На каком-то простом пути?Как узнать, какое приложение JAR не используется?
ответ
Если вы уверены, что можете выполнять свое приложение так, чтобы оно использовало все его баночки, вы можете создать простой сценарий 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
, который должен перечислить все источники загруженных классов.
теперь это действительно опрятный трюк – radai
Что делать, если у меня есть архив веб-приложений (война)? – Trick
Perl-скрипт анализирует исчерпывающий вывод загрузчика класса, для веб-приложения вы можете добавить -verbose к параметрам запуска и проанализировать результирующий стандартный вывод журнала. (Это, вероятно, будет отображать банки, которые также используются контейнером сервлетов.) – rsp
Напишите сценарий, который удаляет их по одному из пути сборки, компилирует проект и проверяет наличие ошибок сборки. Сценарий собрал список неиспользуемых банок. Должно быть легко писать в bash/python.
Это решение не может отслеживать зависимости от времени выполнения на основе отражения (см. Мой комментарий ниже).
. Это найдет ошибки во время компиляции, но не ошибки, которые возникают во время выполнения из отказы отложенной загрузки класса. Особенно в сложных рамках такие вещи довольно распространены. Хуже того, когда структура выбирает один доступный класс для определенного интерфейса, а поведение немного отличается в зависимости от того, какая реализация фактически используется. Я настоятельно рекомендую запустить полный интеграционный тест после того, как вы считаете, что все готово. –
Вы правы, это решение не обрабатывает этот случай. Но я думаю, что это невозможно сделать автоматически, если вы используете какое-то продвинутое отражение. Что бы вы сделали, извлеките все строки кода, которые могут соответствовать имени класса:>? – pajton
Вы также можете сделать это через Eclipse IDE, удалив элементы из .classpath по одному и перестроив проект. Когда материал становится красным, вы удалили тот, который используется. ;-) –
Если вы используете maven, для этого есть mojo: mvn dependency: проанализируйте , если нет, я не знаю ни одного простого способа. жесткий способ включал бы байт-код анализа всех скомпилированных классов вашего проекта для проверки импорта ...
и подумать об этом, даже если не поймать отражение ... – radai
Нет ... Но maven будет улавливать зависимости, объявленные в pom.xml, но не очевидные в коде (например, фреймворки и динамически загружаемые драйверы.) –
Возможно, вы могли написать собственный ClassLoader, наследующий от java.lang.ClassLoader, который регистрирует пути загруженных классов? Это все еще не решает проблему обеспечения полного охвата всех классов, загружаемых в течение всех возможных путей кода, хотя
Я использовал stan. это анализатор структуры для java, и это дало мне очень хорошие результаты.
Вы можете визуально увидеть, какие банки используются, а какие нет.
- 1. Как я могу узнать, какое приложение используется на веб-сайте
- 2. Как узнать, какое приложение открыто?
- 3. Как узнать, какое приложение установить
- 4. Как узнать, какое хранилище используется JVM?
- 5. Какое соединение JAR используется для СУБД Sybase?
- 6. Android: Как узнать, какое приложение было открыто
- 7. Как узнать, какое приложение было выбрано Intent.createChooser?
- 8. Как узнать, работает ли какое-либо приложение?
- 9. Как узнать, какое приложение работает на экране?
- 10. Как узнать, какое приложение openoffice запущено?
- 11. Закройте приложение, когда оно не используется какое-то время
- 12. Использование java, как найти приложение, не используется какое-то время?
- 13. Как узнать, какое приложение использует сборку в GAC?
- 14. Проблема с использованием gzip python/«Как узнать, какое сжатие используется?»
- 15. Как узнать, какое изображение используется при просмотре веб-страницы
- 16. Как узнать, какое локальное приложение подключено к моему сокету (Windows)
- 17. Измените отображение, когда приложение не используется какое-то время
- 18. Как узнать, какое пользовательское веб-приложение работает как?
- 19. Есть ли способ узнать, какое дистрибутив Linux используется?
- 20. Как узнать, какое стороннее приложение называется startActivity в моем приложении
- 21. Как узнать, какое приложение требует определенной сборки от GAC?
- 22. Как узнать, какое приложение имеет вирус на моем Android?
- 23. Android, как узнать, какое приложение открывается в любом экземпляре
- 24. Как узнать, какое приложение Facebook отправляет обновления в реальном времени
- 25. Как узнать, какое приложение потребляет наибольшее пространство на хауопе?
- 26. shareactionprovider: Как узнать, какое приложение использует общий контент?
- 27. Как узнать, какое пространство iCloud использует мое приложение?
- 28. Как узнать, какое приложение было выбрано пользователем при выборе намерения?
- 29. Как узнать, включено ли какое-либо приложение для интернет-браузера
- 30. Как узнать, какое приложение может воспроизводить видео/аудио?
Хороший вопрос. Я также хотел бы знать это :) – Alfred
Я думаю, что это один из самых больших недостатков java, тот факт, что динамические зависимости невозможно скрыть 100%. – karoberts