Как определить, какие JAR-файлы используются в приложении - PullRequest
15 голосов
/ 19 ноября 2010

Существующее приложение имеет кучу JAR-файлов в своем пути к классам. Кто-то должен был изначально добавить все JAR-файлы, просто чтобы быть уверенным. Некоторые из JAR, очевидно, не использовались, и мы уже удалили некоторые из этих ненужных JAR, не вызывая каких-либо проблем.

Как определить, какие JAR-файлы используются, а какие не нужны (кроме метода проб и ошибок)?

Ответы [ 4 ]

7 голосов
/ 19 ноября 2010

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

Здесь ( ссылка больше не работает ) - пример отчета. Как видите, у вас просто есть функция, которую вы ищете " Unused JAR ".

6 голосов
/ 19 ноября 2010

Имейте в виду, что пробой и ошибками могут быть проблемы, особенно если приложение загружает классы динамически (например, Class.forName), так как удаление JAR может не помешать запуску приложения и (по-видимому) нормально работать, но можетошибка позже, если целевые классы не найдены.

Кроме того, есть много инструментов, которые можно использовать для анализа приложения Java и выявления зависимостей (я сам использовал Dependency Finder , хотя и неименно для этой цели), однако обратите внимание, что большинству из них также не удастся найти классы, которые загружаются динамически, как описано выше.

0 голосов
/ 19 ноября 2010

Я использовал следующий сценарий оболочки в проекте портала jboss, чтобы получить список файлов jar, которые используются в операторах импорта.Это будет работать только для прямых зависимостей, а не для динамически загружаемых или даже когда полное имя класса использовалось в источнике.Кроме того, все jar-файлы и их транзитивные зависимости предоставляются контейнером, поэтому они нужны только для компиляции кода.

Цель состояла в том, чтобы создать maven pom для проекта и найти файлы, которые должны бытьразвернут в наш менеджер хранилища Nexus.Это может быть полезно в качестве отправной точки для перечисления файлов, которые определенно необходимы, остальные файлы jar должны быть проверены другими способами.Если 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
0 голосов
/ 19 ноября 2010

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

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