40

你会推荐什么工具来检测Java 包循环依赖,知道目标是明确列出检测到的“跨包循环”中涉及的特定类

我知道classycleJDepend,但它们都没有列出循环包依赖项中涉及的类。Metrics有一个有趣的循环图形表示,但它再次仅限于包,有时很难阅读。

我厌倦了得到一个:

“你在这 3 个包之间有一个包循环依赖关系
,每个包都有 xxx 类,
祝你好运找到正确的类并打破这个循环”

您是否知道任何工具会采取额外步骤来实际向您解释为什么检测到循环(即“列出所涉及的类”)?


Riiight...是时候宣布结果了:

@l7010.de:感谢您的努力。我会投票给你(当我有足够的代表时),特别是对于'CAP'的答案......但是CAP已经死在水中并且不再与我的Eclipse 3.4兼容。其余的都是商业的,我只寻找免费软件。

@daniel6651:谢谢,但如前所述,仅限免费软件(很抱歉一开始没有提到它)。

@izb 作为 findbugs 的频繁用户(现在使用最新的 1.3.5),我只需单击一下就可以接受您的答案...如果您能向我解释有什么选项可以激活 findbug 以检测任何周期。该功能仅在0.8.7 版本中提及(查找“新样式检测器以查找类之间的循环依赖关系”),我无法对其进行测试。更新:它现在可以工作了,我有一个旧的 findbugs 配置文件,其中没有激活该选项。不过我还是喜欢CAD ;)

答案是......在下面看到我自己的(第二个)答案

4

9 回答 9

25

好吧...在测试了上面介绍的 DepFinder之后,事实证明它非常适合快速检测简单的依赖关系,但它不能很好地随着类的数量而扩展...

所以真正的实际答案是: CDA - 类依赖分析器

它快速、最新、易于使用,并提供类及其循环依赖关系的图形表示。梦想成真 ;)

您必须创建一个工作集,您只需在其中输入类的目录(.class)(不需要有完整的类路径)
“检测循环依赖项 - ALT- C”选项作为广告工作,不会占用 100% 的 CPU几个小时来分析我的 468 节课。
注意:要刷新工作区,您需要再次打开它(!),以触发对您的类的新扫描。

截屏

于 2008-09-16T12:12:59.777 回答
14

Findbugs 可以检测循环类依赖关系并且也有一个 Eclipse 插件。

http://findbugs.sourceforge.net/

于 2008-09-15T12:27:35.410 回答
4

还有Structure101应该这样做。

于 2008-09-15T12:26:58.113 回答
4

我们使用Sonar来检测包周期。它绘制了一个很好的依赖关系图,并显示了哪些是错误的方向。您甚至可以导航到使用依赖项的源。

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

于 2010-08-05T14:13:20.873 回答
4

Highwheel检测类和包循环,并将依赖关系的来源报告到类/方法/字段级别,指示关系的类型(继承、组合、方法签名的一部分等)。

它还将大循环分解为可以单独理解/处理的子元素。

输出是带有嵌入式 SVG 内容的 HTML,需要现代浏览器。

于 2013-08-13T18:58:47.777 回答
1

您可以使用开源工具CAP,它是一个 Eclipse 插件。

CAP 有一个图形包视图,它将向您显示类的线条,因此在单击几下(取决于圆圈的大小)后,您会找到罪魁祸首。

于 2008-09-15T12:27:17.877 回答
1

第一个可能的答案是……不漂亮。但它确实开始做我所追求的(下面给出了一个更好的解决方案)。

依赖查找器下载它,解压缩它。

它不是有史以来最现代或最活跃的项目,但如果您编辑 [Dependency Finder]/bin/DependencyFinder.bat,将其路径添加为 DEFAULT_DEPENDENCYFINDER_HOME,设置 JAVA_HOME,即可启动它。

然后单击“提取”按钮(CTRL-E - 第一个按钮),输入您的类路径,然后让它扫描。

棘手的部分是准确地单击正确的“编程元素”和“闭包”项目集,以免被结果中的详细程度所淹没。

  • 仅选择左侧的“类”(“编程元素”)。
  • 仅选择右侧的“类”(“闭包”)。
  • 添加“/javax?./,/org./,/sun./”作为排除模式(对于编程元素和闭包)。
  • 单击轮子(最后一个按钮 - 全部计算 - Ctrl+ A)。

给你。

每当你看到 '<->' 时,你就得到了一个很好的循环依赖。(如果您在“关闭”一侧选择“功能”,您甚至可以知道触发循环的功能 - 太棒了。)

我准备测试任何其他建议。

于 2008-09-15T19:38:48.683 回答
0

执行此操作的一种工具是软件断层扫描仪。它是商业的,用户界面很烂:o

于 2008-09-15T12:26:19.923 回答
0

有一些商业工具:Structure101 和 Lattix 可用于此目的。

于 2008-09-15T12:29:30.307 回答