Обнаружение цикла пакета Java: как найти конкретные участвующие классы?
Какой инструмент вы бы порекомендовали для обнаружения циклических зависимостей пакетов Java, зная, что цель состоит в том, чтобы явно перечислить конкретные классы, вовлеченные в обнаруженный "цикл между пакетами"?
Я знаю о classycle и JDepend, но они оба не в состоянии перечислить классы, вовлеченные в циклическую зависимость пакета. Метрика имеет интересное графическое представление циклов, но она опять-таки ограничена пакетами, и иногда ее довольно сложно читать.
Я устаю, чтобы получить:
"у вас есть зависимость цикла пакета между этими 3 пакетами
у вас есть классы ххх в каждом
удачи в поиске правильных занятий и разрыве этого цикла "
Знаете ли вы какой-либо инструмент, который делает дополнительный шаг, чтобы фактически объяснить вам, почему цикл обнаружен (например, "перечислить вовлеченные классы")?
Riiight... Время объявить результаты:
@ l7010.de: Спасибо за усилия. Я буду голосовать за вас (когда у меня будет достаточно повторений), особенно за ответ "CAP"... но CAP мертв в воде и больше не совместим с моим Eclipse 3.4. Остальное коммерческое, и я ищу только бесплатное программное обеспечение.
@ daniel6651: Спасибо, но, как уже говорилось, бесплатное программное обеспечение (извините, что не упомянул об этом в первую очередь).
@izb как частый пользователь findbugs (использующий самую последнюю версию 1.3.5 прямо сейчас), я в одном клике, чтобы принять ваш ответ... если бы вы могли объяснить мне, какой вариант есть, чтобы findbug обнаруживал любой цикл. Эта особенность упоминается только для версии 0.8.7 мимоходом (ищите "Детектор нового стиля, чтобы найти круговые зависимости между классами"), и я не могу проверить это. Обновление: теперь это работает, и у меня был старый файл конфигурации findbugs, в котором эта опция не была активирована. Я все еще люблю CAD, хотя;)
ОТВЕТ... см. Мой собственный (второй) ответ ниже
9 ответов
Findbugs может обнаруживать циклические зависимости классов и также имеет плагин Eclipse.
Что ж... после тестирования DepFinder, представленного выше, оказалось, что он отлично подходит для быстрого обнаружения простых зависимостей, но он плохо масштабируется с количеством классов...
Итак, НАСТОЯЩИЙ АКТУАЛЬНЫЙ ОТВЕТ: CDA - Анализатор зависимостей класса
Он быстрый, современный, простой в использовании и обеспечивает графическое представление классов и их циклических зависимостей. Мечты сбываются;)
Вы должны создать рабочий набор, в котором вы вводите только каталог ваших классов (.class) (нет необходимости иметь полный путь к классам)
Опция "Определить циклические зависимости - ALT-C" работает как реклама и не тратит 100% ресурсов ЦП на анализ моих 468 классов в течение нескольких часов.
Примечание: чтобы обновить рабочее пространство, вам нужно открыть его снова (!), Чтобы запустить новое сканирование ваших классов.
Мы используем Sonar для обнаружения циклов упаковки. Он рисует хороший график зависимостей и показывает, какие из них идут в неправильном направлении. Вы даже можете перейти к источнику, где используется зависимость.
Смотрите http://www.sonarsource.org/fight-back-design-erosion-by-breaking-cycles-with-sonar/
Highwheel обнаруживает циклы классов и пакетов и сообщает источник зависимостей вплоть до уровня класса / метода / поля, указывая тип отношения (наследование, состав, часть сигнатуры метода и т. Д.).
Это также разбивает большие циклы на их подэлементы, которые могут быть поняты / решены индивидуально.
Вывод - HTML со встроенным SVG-контентом, который требует современного браузера.
Первый возможный ответ... не симпатичный. Но он начинает делать то, что мне нужно (лучшее решение представлено ниже).
Поиск зависимостей! Загрузите, разархивируйте.
Это не самый современный или активный проект в истории, но если вы отредактируете [Dependency Finder]/bin/DependencyFinder.bat, добавите его путь для DEFAULT_DEPENDENCYFINDER_HOME, установите JAVA_HOME, вы можете запустить его.
Затем вы нажимаете кнопку "Извлечь" (CTRL-E - первая кнопка), вводите путь к классам и позволяете ему сканировать.
Сложность состоит в том, чтобы щелкнуть в точности правильный набор "элементов программирования" и "замыканий", чтобы не быть забитым уровнем детализации в результате.
- Выберите только "классы" в левой части ("элементы программирования").
- Выберите только "классы" в правой части ("замыкания").
- Добавьте "/javax?./,/org./,/sun./" в качестве шаблона исключения (как для элементов программирования, так и для замыканий).
- Нажмите на колеса (последняя кнопка - Вычислить все - Ctrl + A).
И вот, пожалуйста.
Всякий раз, когда вы видите "<->", вы получаете хорошую циклическую зависимость. (Если вы выберете "функции" на стороне "замыкания", вы даже сможете узнать, какая функция запускает цикл - потрясающе.)
Я готов проверить любые другие предложения.
И вы можете использовать инструмент с открытым исходным кодом CAP, который является плагином Eclipse.
CAP имеет графическое представление пакета, которое покажет вам линии к классам, поэтому после нескольких щелчков (в зависимости от размера круга) вы найдете виновника.
Одним из инструментов, который делает это, является программный томограф. Это коммерческий и пользовательский интерфейс отстой: о
Есть несколько коммерческих инструментов: Structure101 & Lattix, которые можно использовать для этой цели.