Обнаружение цикла пакета Java: как найти конкретные участвующие классы?

Какой инструмент вы бы порекомендовали обнаружить циклические зависимости пакета Java, зная, что цель состоит в том, чтобы явно перечислить конкретные классы, вовлеченные в обнаруженный "цикл между пакетами"?

Я знаю о classycle и JDepend, но они оба не в состоянии перечислить классы, участвующие в зависимости циклического пакета. Metrics имеет интересное графическое представление циклов, но оно опять-таки ограничено пакетами, и иногда его довольно сложно читать.

Я устал, чтобы получить:

"у вас есть зависимость цикла пакета между этими 3 пакетами
у вас есть классы ххх в каждом
удачи в поиске правильных классов и разорвать этот цикл "

Знаете ли вы какой-либо инструмент, который делает дополнительный шаг, чтобы фактически объяснить вам, почему цикл обнаружен (то есть "перечислить вовлеченные классы")?


Riiight... Время объявить результаты:

@l7010.de: Спасибо за усилия. Я буду голосовать за вас (когда у меня будет достаточно представителей), особенно за ответ "CAP"... но CAP мертв в воде и больше не совместим с моим Eclipse 3.4. Остальное коммерческое, и я ищу только бесплатное ПО.

@daniel6651: Спасибо, но, как уже говорилось, только бесплатное ПО (извините, что не упомянуло об этом в первую очередь).

@izb как частый пользователь findbugs (использующий последнюю версию 1.3.5 прямо сейчас), я в одном клике, чтобы принять ваш ответ... если бы вы могли объяснить мне, какой вариант есть, чтобы findbug обнаруживал любой цикл. Эта функция упоминается только для версии 0.8.7 при прохождении (ищите "Детектор нового стиля, чтобы найти круговые зависимости между классами"), и я не могу его протестировать. Обновление: теперь это работает, и у меня был старый файл конфигурации findbugs, в котором эта опция не была активирована. Мне все еще нравится CAD ;)

ОТВЕТ... см. мой собственный (второй) ответ ниже

Ответ 1

Findbugs может обнаруживать циклические зависимости классов и также имеет плагин Eclipse.

http://findbugs.sourceforge.net/

Ответ 2

Что ж... после тестирования DepFinder, представленного выше, выясняется, что он отлично подходит для быстрого обнаружения простых зависимостей, но он плохо масштабируется с количеством классов...

Итак, НАСТОЯЩИЙ АКТУАЛЬНЫЙ ОТВЕТ: CDA - анализатор зависимостей классов

Он быстрый, современный, простой в использовании и обеспечивает графическое представление классов и их циклических зависимостей. Мечта сбылась;)

Вы должны создать рабочий набор, в котором вы вводите только каталог ваших классов (.class) (нет необходимости иметь полный путь к классам)
Опция "Обнаружение циклических зависимостей - ALT - C" работает как реклама и не тратит 100% ЦП на часы для анализа моих 468 классов.
Примечание: чтобы обновить рабочее пространство, вам нужно открыть его снова (!), Чтобы запустить новое сканирование ваших классов.

screenshot

Ответ 3

Существует также Structure101, который должен это делать.

Ответ 4

Мы используем Sonar для обнаружения циклов пакетов. Он рисует хороший график зависимостей и показывает, какие из них идут в неправильном направлении. Вы даже можете перейти к источнику, в котором используется зависимость.

См. http://www.sonarsource.org/fight-back-design-erosion-by-breaking-cycles-with-sonar/

Ответ 5

Highwheel обнаруживает циклы классов и пакетов и сообщает источник зависимостей вплоть до уровня класса/метода/поля, указывая тип отношения (наследование, состав, часть сигнатуры метода и т.д.).

Он также разбивает большие циклы на их подэлементы, которые могут быть поняты/рассмотрены индивидуально.

На выходе получается HTML со встроенным SVG-контентом, который требует современного браузера.

Ответ 6

И вы можете использовать инструмент с открытым исходным кодом CAP, который является плагином Eclipse.

CAP имеет графическое представление пакета, которое покажет вам линии к классам, поэтому после нескольких щелчков (в зависимости от размера круга) вы найдете виновника.

Ответ 7

Первый возможный ответ... не очень. Но он начинает делать то, что я после (лучшее решение представлено ниже).

Поиск зависимостей! Загрузите его, распакуйте.

Это не самый современный или активный проект в истории, но если вы отредактируете [Dependency Finder]/bin/DependencyFinder.bat, добавьте его путь для DEFAULT_DEPENDENCYFINDER_HOME, установите JAVA_HOME, вы можете запустить его.

Затем нажмите кнопку "Извлечь" (CTRL-E - первая кнопка), введите путь к классам и дайте ему отсканировать.

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

  • Выберите только "классы" в левой части ("элементы программирования").
  • Выберите только "классы" в правой части ("замыкания").
  • Добавьте "/javax?./,/org./,/sun./" в качестве шаблона исключения (как для элементов программирования, так и для замыканий).
  • Нажмите на колеса (последняя кнопка - Вычислить все - Ctrl + A).

И вот, пожалуйста.

Всякий раз, когда вы видите '& lt; ->', вы получаете хорошую циклическую зависимость. (Если вы выберете "функции" на стороне "замыкания", вы даже сможете узнать, какая функция запускает цикл - потрясающе.)

Я готов проверить любые другие предложения.

Ответ 8

Одним из инструментов, который делает это, является программный томограф. Это коммерческий и пользовательский интерфейс отстой: о

Ответ 9

Существуют некоторые коммерческие инструменты: Structure101 и Lattix, которые могут быть использованы для этой цели.