Java包循环检测:如何找到涉及的具体类? [关闭]

Posted

技术标签:

【中文标题】Java包循环检测:如何找到涉及的具体类? [关闭]【英文标题】:Java package cycle detection: how do I find the specific classes involved? [closed] 【发布时间】:2010-09-08 21:40:15 【问题描述】:

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

我知道classycle 和JDepend,但它们都没有列出循环包依赖项中涉及的类。 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

【问题讨论】:

只需将答案放在问题中即可。吉普车信息一起。 【参考方案1】:

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

【讨论】:

【参考方案2】:

还有Structure101应该这样做。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

http://findbugs.sourceforge.net/

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

Dependency Finder! Download it,解压。

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

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

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

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

给你。

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

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

【讨论】:

【参考方案7】:

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

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

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

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

此功能已从 SonarQube 5.2 (SONAR-6553) 中删除。【参考方案9】:

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

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

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

【讨论】:

以上是关于Java包循环检测:如何找到涉及的具体类? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

JAVA编写类似按键精灵的程序用于游戏 会被检测到么?懂底层工作原理的JAVA高手进

AfxBeginThread开启一个线程,怎样去关闭这个线程

如何在Java中检测按键

我想在 for 循环中找到最小值/最大值 [关闭]

Java案例:随机点名程序

Java案例:Swing摇奖器