Java包循环检测:如何查找涉及的特定类?

时间:2008-09-15 12:11:09

标签: java class dependencies packages

您建议使用哪种工具来检测 Java包循环依赖, 知道目标是明确列出检测到的'跨包循环'中涉及的特定类?

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

我厌倦了得到一个:

  

“这3个软件包之间有一个软件包周期依赖   每个中都有xxx类   祝你找到合适的课程并打破这个循环“

你知道有什么工具可以采取额外的步骤来实际解释为什么检测到周期(即'列出所涉及的类')?


Riiight ......时间宣布结果:

@ l7010.de:谢谢你的努力。我会投票给你(当我有足够的代表时),特别是对于'CAP'答案......但是CAP已经死了,不再与我的Eclipse 3.4兼容了。其余的是商业广告,我只看免费软件。

@ daniel6651:谢谢你,但正如所说,只是免费软件(很遗憾没有首先提到它)。

@izb作为findbugs的常用用户(现在使用最新的1.3.5),我只需点击一下即可接受你的答案...如果你能向我解释一下有什么选项可以激活findbug来检测任何循环。该功能仅针对0.8.7 version in passing提及(查找'新风格检测器以查找类之间的循环依赖关系'),我无法对其进行测试。 更新:它现在有效,我有一个旧的findbugs配置文件,其中没有激活该选项。我仍然喜欢CAD;)

答案是......见my own (second) answer below

9 个答案:

答案 0 :(得分:25)

嗯......在测试DepFinder presented above之后,事实证明它很适合快速检测简单的依赖关系,但它不能很好地扩展类的数量......

所以真正的实际答案是: 的 CDA - Class Dependency Analyzer

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

您必须创建一个工作集,在该工作集中只输入类的目录(.class)(不需要完整的类路径)
“检测循环依赖关系 - ALT - C ”选项可用作广告,并且不会花费100%的时间来分析我的468个班级。 注意:要刷新工作区,您需要再次打开它(!),以便触发对类的新扫描。

screenshot

答案 1 :(得分:14)

Findbugs可以检测循环类依赖项,也有一个Eclipse插件。

http://findbugs.sourceforge.net/

答案 2 :(得分:4)

还有Structure101应该这样做。

答案 3 :(得分:4)

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

请参阅http://www.sonarsource.org/fight-back-design-erosion-by-breaking-cycles-with-sonar/

答案 4 :(得分:4)

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

它还将大周期分解为其子元素,可以单独理解/处理。

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

答案 5 :(得分:1)

您可以使用Eclipse插件的开源工具CAP

CAP有一个图形包视图,它会向你显示类的行,所以在点击一下后(根据圆的大小)你会发现罪魁祸首。

答案 6 :(得分:1)

第一个可能的答案是......不漂亮。但它确实开始做我想要的事情 (更好的解决方案是presented below)。

Dependency FinderDownload it,解压缩。

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

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

棘手的部分是完全点击正确的“编程元素”和“闭包”项目,以免被结果中的细节级别所淹没。

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

你走了。

每当你看到'< - >'时,你就会得到一个很好的循环依赖。 (如果在'闭合'一侧选择'特征',你甚至可以知道触发循环的功能 - 真棒。)

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

答案 7 :(得分:0)

执行此操作的一个工具是软件tomograph。它很商业化,用户界面很糟糕:o

答案 8 :(得分:0)

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