Как определить, какие JAR используются в приложении
В существующем приложении имеется тонна JAR файлов в его пути к классам. Кто-то, должно быть, сначала добавил все JAR, чтобы быть уверенным. Некоторые из JAR явно не использовались, и мы уже удалили некоторые из этих ненужных JAR без каких-либо проблем.
Как определить, какие JAR используются и какие из них не нужны (помимо метода проб и ошибок)?
Ответы
Ответ 1
Tattletale - отличный инструмент для этого. Он работает на байт-коде, поэтому возможно, что некоторые классы используются через отражение и не будут отображаться в отчете.
Здесь (ссылка больше не работает) является примером отчета. Как вы можете видеть, у вас просто есть функция, которую вы ищете " Unused JAR".
Ответ 2
Помните, что пробная версия и сама по себе проблема может быть проблемой, особенно если приложение загружает классы динамически (например, Class.forName
), поскольку удаление JAR может не помешать запуску приложения и (по-видимому) работать нормально, но может не выполняются позже, если целевые классы не найдены.
Кроме того, существует множество инструментов, которые можно использовать для анализа приложения Java и определения зависимостей (я сам использовал Finder Finder, хотя не совсем для этой цели), однако обратите внимание, что большинство из них также не смогут найти классы, которые загружаются динамически, как описано выше.
Ответ 3
Если какой-либо из них загружен динамически, возможно, что автоматические инструменты будут пропускать их. Я бы reset время доступа к файлам, запустил приложение на некоторое время (и обязательно вызовет как можно больше функций) и посмотрим, к каким файлам обращались, а какие нет. Возможно, вам придется повторить это на каждой платформе, на которой ваше приложение должно работать, на всякий случай.
Ответ 4
Я использовал следующую оболочку script в проекте портала jboss, чтобы получить список файлов jar, которые используются в операторах импорта. Это будет вашей работы только для прямых зависимостей, а не для динамической загрузки или даже когда в источнике было использовано полное имя класса. Кроме того, все файлы jar и их транзитивные зависимости предоставляются контейнером, поэтому они необходимы только для компиляции кода.
Целью было создать maven pom для проекта и найти файлы, которые необходимо было развернуть в нашем диспетчере репозитория nexus. В качестве отправной точки может быть полезно указать файлы, которые определенно необходимы, остальные файлы jar должны быть проверены другими способами. Если банку также доступно в репозитории maven, вы можете, например, посмотреть его зависимости.
#!/bin/sh
JBOSS_HOME=/path/to/jboss/installation
JBOSS_LIB=$JBOSS_HOME/server/default/lib
JBOSS_DEPLOY=$JBOSS_HOME/server/default/deploy
SRC_DIR=src
for f in $JBOSS_LIB/*.jar $JBOSS_DEPLOY/jboss-portal.sar/lib/*.jar $JBOSS_DEPLOY/jboss-portal.sar/portal-cms.sar/lib/*.jar $JBOSS_DEPLOY/ejb3.deployer/*.jar
do
for c in `jar -tf $f | tr '/$' '..'`
do
#echo "^import ${c%.class};"
if `grep "^import ${c%.class};" -h -r $SRC_DIR -q`
then
echo $f $c
fi
done
done