Инструмент для удаления ненужных зависимостей в проекте Java
У меня есть проект Java, который в настоящее время имеет много JAR-файлов в своем каталоге библиотек, которые все включены в получившийся пакет при сборке. Однако я знаю, что некоторые из этих библиотек никогда не упоминаются в проекте.
Существует ли инструмент для поиска библиотек, на которые нет ссылок в проекте? Я думаю, что-то должно быть в этом смысле.
Кстати, Eclipse-плагин был бы великолепен.
РЕДАКТИРОВАТЬ: Я решил пойти с ClassDep, потому что это было единственное предложение, которое сработало. Однако у меня возникли некоторые проблемы: проверьте этот вопрос.
6 ответов
ClassDep (от Sun, в комплекте для разработки Jini) сделает это за вас.
Остерегайтесь случая, когда класс загружается через Class.forName() и не указывается в качестве зависимости в файле манифеста (для этого есть атрибут Depends-On:, но многие его не указывают, что нарушает такие инструменты, как проклятие моего существования, когда я работал над таким инструментом).
ClassPathHelper может помочь вам в этом.
Особенно "Не на Classpath View"
В этом представлении выполняется поиск банок, которые не находятся на пути к классам (но находятся в текущем проекте). Он обеспечивает базовый просмотр пакетов и классов, которые доступны, но отсутствуют в пути к классам. Это может быть полезно при попытке создать путь к классам, так как вы можете быстро найти отсутствующие классы, чтобы увидеть, какие файлы содержат их.
Не плагин Eclipse, но я считаю, что "сокращающаяся" функциональность ProGuard - это именно то, что вам нужно.
Я написал небольшой плагин Eclipse, который берет существующий Java-проект из рабочей области. Для каждой записи пути к классам необработанного пути к классам проектов он удаляет его из пути к исходным классам проектов и создает проект. Если в проекте не появятся маркеры проблемы с ошибкой серьезности, он окончательно удалит запись пути к классам из необработанного пути к проектам.
Я не могу поделиться этим плагином, но это не слишком большая работа, чтобы реализовать его самостоятельно с помощью ссылок на API, приведенных выше.
Вы также не можете сказать, являются ли JAR, которые вы не импортируете, необходимыми зависимостями зависимостей. Например, если вы используете Spring, он имеет свои собственные зависимости, даже если вы не импортируете или не вызываете эти классы в своем коде. Я не знаю ProGuard - он проверяет эти случаи?