Java包周期检测:如何找到涉及的特定类?
我们建议使用哪种工具来检测Java包的循环依赖关系,
知道目标是明确列出检测到的"跨包循环"中涉及的特定类吗?
我知道classycle和JDepend,但是它们都无法列出循环软件包依赖项中涉及的类。度量标准具有有趣的循环图形表示形式,但它又仅限于软件包,并且有时很难读取。
我很累得到:
" you have a package cycle dependency between those 3 packages you have xxx classes in each good luck finding the right classes and break this cycle "
我们是否知道需要采取额外步骤才能真正向我们解释为什么检测到周期的任何工具(即"列出相关的类")?
Riiight ...该宣布结果了:
@ l7010.de:谢谢努力。我会投票赞成(当我有足够的代表时),尤其是对于" CAP"答案……但是CAP已经死了,并且不再与我的Eclipse 3.4兼容。其余的是商业产品,我只寻找免费软件。
@ daniel6651:谢谢,但是,正如所说的,仅是免费软件(对不起,我们一开始没有提到它)。
@izb是findbugs的经常用户(现在使用最新的1.3.5),我一键即可接受答案...如果我们可以向我说明激活findbug来检测任何周期的选项是什么。此功能仅在通过时提到0.8.7版本(请查找"新样式检测器以查找类之间的循环依赖项"),而我无法对其进行测试。
更新:现在可以正常工作了,并且我有一个旧的findbugs配置文件,其中该选项未激活。我还是喜欢CAD;)
答案是...请参阅下面我自己的(第二个)答案
解决方案
回答
层析成像仪是实现此目的的一种工具。它是商业性的,UI很烂:o
回答
还有Structure101应该执行此操作。
回答
我们可以使用开源工具CAP,它是Eclipse插件。
CAP具有图形化的程序包视图,该视图将向我们显示类的行,因此单击几下(取决于圆的大小)后,我们将找到罪魁祸首。
回答
Findbugs可以检测循环类依赖关系,并且也具有Eclipse插件。
http://findbugs.sourceforge.net/
回答
有一些商业工具:Structure101和Lattix可以用于此目的。
回答
第一个可能的答案是……不漂亮。但这确实开始做我所追求的
(下面提供了一个更好的解决方案)。
依赖查找器!下载它,解压缩。
它不是有史以来最现代或者最活跃的项目,但是如果我们编辑[Dependency Finder] /bin/DependencyFinder.bat,为DEFAULT_DEPENDENCYFINDER_HOME添加其路径,设置一个JAVA_HOME,则可以启动它。
然后,单击"提取"按钮(第一个CTRL-E按钮),输入课程路径,然后将其扫描掉。
棘手的部分是准确地单击"编程元素"和"关闭"项的正确集合,以免被结果的详细程度所淹没。
- 在左侧仅选择"类"("编程元素")。
- 在右侧仅选择"类"("关闭")。
- 添加" /javax?./,/org./,/sun./"作为排除模式(用于编程元素和闭包)。
- 单击轮子(最后一个按钮-全部计算-Ctrl + A)。
然后你去。
每当我们看到'<->'时,我们就会得到一个很好的循环依赖关系。 (如果在"关闭"端选择"功能",我们甚至可以知道是什么功能触发了该循环。)
我准备测试其他建议。
回答
好吧...在测试了上面介绍的DepFinder之后,事实证明它非常适合快速检测简单的依赖关系,但是它不能随着类的数量很好地扩展...
因此,实际答案是:
CDA类依赖性分析器
它快速,最新,易于使用,并提供类及其循环依赖关系的图形表示。梦想成真 ;)
我们必须创建一个工作集,在其中仅输入类的目录(.class)(不需要完整的类路径)
选项"检测循环依赖项ALT -C"可作为广告工作,并且不需要花费100%的CPU几个小时来分析我的468类。
注意:要刷新工作区,我们需要再次打开它(!),以触发对类的新扫描。
回答
我们使用Sonar来检测包装周期。它绘制了一个很好的依赖关系图,并显示了哪个方向错误。我们甚至可以导航到使用依赖项的源。
参见http://www.sonarsource.org/fight-back-design-erosion-by-breaking-cycles-with-sonar/