Как узнать, какие jar-файлы действительно используются при компиляции java-проекта? - PullRequest
15 голосов
/ 19 ноября 2009

В настоящее время я передаю очень большой путь к классу javac для компиляции проекта java.

Я знаю, что некоторые из этих jar-файлов не нужны.

Есть ли простой способ выяснить, какие файлы не нужны?

Ответы [ 6 ]

11 голосов
/ 19 ноября 2009

Вам нужен инструмент Class Dependency Analyzer . Цитировать вступление:

Цель этого инструмента - проанализировать файлы классов Java ™, чтобы узнать больше о зависимостях между этими классами.

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

Если вы ожидаете зависимости во время выполнения, вы должны использовать CDA в качестве первого прохода, а затем провести исчерпывающее тестирование результирующего приложения, чтобы убедиться в отсутствии файлов JAR, на которые ссылались только через зависимости времени выполнения.

8 голосов
/ 19 ноября 2009

Полагаю, что "удалить их по одному и проверить, все ли приложение компилируется и работает" - это не ожидаемый ответ:)


(РЕДАКТИРОВАТЬ: Хотя предложенный выше подход может быть немного автоматизированным, он остается несколько болезненным, и должна быть альтернатива, по крайней мере для зависимостей во время компиляции. После некоторого поиска в Google, я нашел Jar Analyzer который, кажется, хороший инструмент для этой работы, как объяснено в этом сообщении в блоге :

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

Вы также можете увидеть JAR-файлы, которые не имеют никакого отношения к вашему коду, удалить их и их потомков. В нашей папке libs я обнаружил, что около 20% из 150 файлов JAR в нашей папке libs не использовались во время компиляции, и это были потенциальные файлы JAR, которые необходимо удалить.

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

Единственный способ выяснить, используется ли JAR-файл во время выполнения, состоит в том, чтобы вынуть его, запустить приложение и проверить все функциональные возможности. Если у вас есть приложение среднего размера, выполнение 100% -ного регрессионного теста занимает много часов. Так что на практике я закончил много гаданий, быстрых и грязных тестов и расспросил, чтобы выяснить, какие из зависимостей времени выполнения действительно использовались.

Кажется довольно простым в использовании: скачайте, разархивируйте и запустите инструмент в каталоге, содержащем все jar-файлы. Или используйте предоставленную задачу Ant.)

5 голосов
/ 30 августа 2013

У вас также есть oosejar.jar , который позволяет вам находить реальные зависимости jar вашего проекта во время выполнения!

2 голосов
/ 19 ноября 2009

Компилятор имеет опцию -verbose, и это довольно многословно. Он информирует о каждом загружаемом классе и о том, откуда он загружен!

Хотя это не совсем удобно и не обеспечивает высокоуровневый анализ, я нашел его очень полезным для отладки конфликтов путей к классам. Это говорит вам о банках, которые используются (с помощью grep), а не о тех, которые не используются.

2 голосов
/ 19 ноября 2009

Последняя сборка eclipse предупредит вас о неиспользованном импорте в ваш исходный код

1 голос
/ 19 ноября 2009
...