您使用什么工具在大型Java项目中查找未使用/无效的代码?我们的产品已经开发了几年,并且很难手动检测不再使用的代码。但是,我们确实尝试删除尽可能多的未使用的代码。
对于一般策略/技术(除特定工具之外)的建议也将受到赞赏。
编辑:请注意,我们已经使用了代码覆盖率工具(Clover,IntelliJ),但是这些帮助不大。无效代码仍具有单元测试,并显示为已覆盖。我猜一个理想的工具可以识别出几乎没有其他代码依赖的代码集群,从而可以对文档进行手动检查。
您使用什么工具在大型Java项目中查找未使用/无效的代码?我们的产品已经开发了几年,并且很难手动检测不再使用的代码。但是,我们确实尝试删除尽可能多的未使用的代码。
对于一般策略/技术(除特定工具之外)的建议也将受到赞赏。
编辑:请注意,我们已经使用了代码覆盖率工具(Clover,IntelliJ),但是这些帮助不大。无效代码仍具有单元测试,并显示为已覆盖。我猜一个理想的工具可以识别出几乎没有其他代码依赖的代码集群,从而可以对文档进行手动检查。
Answers:
我将对正在运行的系统进行检测以保留代码使用情况的日志,然后开始检查几个月或几年未使用的代码。
例如,如果您对未使用的类感兴趣,那么可以创建所有类以记录创建实例时的日志。然后,一个小的脚本可以将这些日志与类的完整列表进行比较,以找到未使用的类。
当然,如果您使用方法级别,则应牢记性能。例如,这些方法只能记录其首次使用。我不知道这是如何用Java最好完成的。我们是在Smalltalk中完成的,Smalltalk是一种动态语言,因此可以在运行时修改代码。我们使用日志记录调用对所有方法进行检测,并在首次记录方法后卸载日志记录代码,因此一段时间后,不再发生性能损失。也许可以使用静态布尔值在Java中完成类似的操作...
运行良好的Eclipse插件是Unused Code Detector。
它处理整个项目或特定文件,并显示各种未使用/无效的代码方法,并建议可见性更改(即可以受保护或私有的公共方法)。
Last updated this plugin March 27, 2012
developers.google.com/java-dev-tools/download-codepro
我很惊讶在这里没有提到ProGuard。它是周围最成熟的产品之一。
ProGuard是免费的Java类文件收缩器,优化器,混淆器和预验证器。它检测并删除未使用的类,字段,方法和属性。它优化字节码并删除未使用的指令。它使用简短的无意义名称重命名其余的类,字段和方法。最后,它会预先验证Java 6或Java Micro Edition的处理后代码。
ProGuard的一些用途是:
- 创建更紧凑的代码,以实现更小的代码归档,更快的网络传输,更快的加载和更小的内存占用。
- 使程序和库更难以逆向工程。
- 列出无效代码,因此可以将其从源代码中删除。
- 重新定位和预验证Java 6或更高版本的现有类文件,以充分利用它们更快的类加载速度。
以下是列出无效代码的示例:https : //www.guardsquare.com/en/products/proguard/manual/examples#deadcode
我已经知道在Eclipse上的一个类中要做的一件事是将其所有方法都更改为私有方法,然后查看我收到的投诉。对于使用的方法,这会引发错误,我将它们返回到可以达到的最低访问级别。对于未使用的方法,这将引发关于未使用方法的警告,然后可以将其删除。另外,您经常会发现一些可以并且应该私有的公共方法。
但这是非常手动的。
使用测试覆盖率工具来检测您的代码库,然后运行应用程序本身,而不是测试。
艾玛(Emma)和埃克莱玛(Eclemma)将为您提供有关任何给定代码运行量的百分比百分比的漂亮报告。
从理论上讲,您无法确定性地找到未使用的代码。有一个数学上的证明(嗯,这是一个更一般的定理的特例)。如果您好奇,请查找“暂停问题”。
这可以通过多种方式在Java代码中体现出来:
就是说,我将IDEA IntelliJ用作我的首选IDE,它具有用于模块,未使用的方法,未使用的成员,未使用的类等之间的依赖关系的广泛分析工具。它非常智能,就像未调用的私有方法是标记为未使用,但公共方法需要更广泛的分析。
IntelliJ具有代码分析工具,用于检测未使用的代码。您应该尝试使尽可能多的字段/方法/类尽可能不公开,这将显示更多未使用的方法/字段/类
我还将尝试查找重复的代码,以减少代码量。
我的最后一个建议是尝试查找开放源代码,如果使用开放源代码,它将使您的代码更简单。
Analyse
=> Run inspection by name
=>unused
DCD不是某些IDE的插件,但可以从ant或独立运行。它看起来像一个静态工具,可以完成PMD和FindBugs无法完成的工作。我会试试。
PS如下面的评论中所述,该项目现在位于GitHub中。
用户覆盖工具,例如EMMA。但这不是静态工具(即,它需要通过回归测试以及所有可能的错误情况来实际运行应用程序,这是不可能的:))
尽管如此,EMMA还是非常有用的。
艾玛(Emma),柯贝图拉(Cobertura)和三叶草(Clover)等代码覆盖工具将对您的代码进行检测,并记录通过运行一系列测试来调用其中的哪些部分。这非常有用,并且应该是开发过程中不可或缺的一部分。这将帮助您确定测试套件覆盖代码的程度。
但是,这与识别实际无效代码不同。它仅标识测试涵盖(或未涵盖)的代码。这可能会给您带来误报(如果您的测试不能涵盖所有场景),也可能给您带来误报(如果您的测试访问的代码实际上在实际场景中从未使用过)。
我想,真正识别无效代码的最佳方法是在实时运行的环境中使用覆盖率工具对代码进行检测,并分析长时间的代码覆盖率。
如果您在负载平衡的冗余环境中运行(如果不是,为什么呢?),那么我认为只对应用程序的一个实例进行检测并配置负载均衡器是合理的,这样可以使其中的一部分随机但很小。您的用户在您的检测实例上运行。如果您在较长的时间内执行此操作(以确保您已涵盖所有实际使用情况-这样的季节性变化),则应该能够准确查看在实际使用情况下访问了哪些代码区域以及哪些部分实际上从未被访问过,因此代码无效。
我从来没有亲眼目睹这件事的完成,也不知道上述工具如何用于检测和分析未通过测试套件调用的代码-但我相信它们可以做到。
有一个Java项目- 死代码检测器(DCD)。对于源代码,它似乎不能很好地工作,但是对于.jar文件-确实很好。另外,您可以按类和方法进行过滤。
Netbeans 这里是Netbeans 死代码检测器的插件。
如果它可以链接并突出显示未使用的代码,那就更好了。您可以在此处投票和评论:错误181458-查找未使用的公共类,方法,字段
Eclipse可以显示/突出显示无法访问的代码。JUnit可以向您显示代码覆盖率,但是您需要一些测试,并且必须确定是否缺少相关测试或代码是否确实未使用。
我发现了四叶草覆盖率工具,该工具可检测代码并突出显示已使用和未使用的代码。与Google CodePro Analytics不同,它也适用于WebApplications(根据我的经验,我对Google CodePro可能不正确)。
我注意到的唯一缺点是它没有考虑Java接口。