您使用什么工具来查找大型 java 项目中未使用/死的代码?我们的产品已经开发了几年,手动检测不再使用的代码变得非常困难。然而,我们确实尝试删除尽可能多的未使用的代码。

对于一般策略/技术(特定工具除外)的建议也值得赞赏。

编辑: 请注意,我们已经使用了代码覆盖率工具(Clover、IntelliJ),但这些帮助不大。死代码仍然有单元测试,并且显示为已覆盖。我想一个理想的工具会识别代码集群,这些代码集群几乎没有其他代码依赖它,从而允许文档手动检查。

有帮助吗?

解决方案

我会检测正在运行的系统以保存代码使用日志,然后开始检查未使用数月或数年的代码。

例如,如果您对未使用的类感兴趣,则可以检测所有类以在创建实例时进行记录。然后一个小脚本可以将这些日志与完整的类列表进行比较,以找到未使用的类。

当然,如果你采用方法级别,你应该记住性能。例如,这些方法只能记录它们的首次使用。我不知道如何用Java做得最好。我们在Smalltalk中完成了这项工作,Smalltalk是一种动态语言,因此允许在运行时进行代码修改。我们使用日志记录调用对所有方法进行检测,并在首次记录方法后卸载日志记录代码,因此在一段时间后不再出现性能损失。也许在Java中可以使用静态布尔标志来完成类似的事情......

其他提示

运行良好的Eclipse插件是未使用的代码检测器

它处理整个项目或特定文件,并显示各种未使用/死代码方法,以及建议可见性更改(即可以保护或私有的公共方法)。

CodePro 最近由Google发布了Eclipse项目。它是免费且高效的。该插件包含一个/多个入口点的“查找死代码”功能(S)。效果很好。

我很惊讶 混淆卫士 这里没有提到。它是最成熟的产品之一。

混淆卫士 是一个免费的 Java 类文件压缩器、优化器、混淆器、 和预验证程序。它检测并删除未使用的类、字段、 方法和属性。它优化了字节码并删除了未使用的字节码 指示。它重命名其余的类、字段和方法 使用简短而无意义的名称。最后,它预验证处理后的 Java 6 或 Java Micro Edition 的代码。

ProGuard 的一些用途是:

  • 创建更紧凑的代码,实现更小的代码存档、更快的网络传输、更快的加载速度和更小的内存 脚印。
  • 使程序和库更难进行逆向工程。
  • 列出死代码,以便可以将其从源代码中删除。
  • 重新定位和预验证 Java 6 或更高版本的现有类文件,以充分利用其更快的类加载速度。

这里是列出死代码的示例: https://www.guardsquare.com/en/products/proguard/manual/examples#deadcode

我在Eclipse中已经知道的一件事,就是在一个单独的类中,将所有方法改为私有,然后看看我得到了什么样的抱怨。对于使用的方法,这将引发错误,并且我将它们返回到我能够的最低访问级别。对于未使用的方法,这将引发有关未使用方法的警告,然后可以删除这些方法。作为奖励,您经常会找到一些可以而且应该被私有的公共方法。

但这是非常手动的。

使用测试覆盖率工具来检测代码库,然后运行应用程序本身,而不是测试。

Emma Eclemma 将为您提供很好的报告,说明在任何给定的代码运行中运行的类的百分比。

我们已经开始使用查找错误来帮助识别代码库中目标丰富的一些功能重构的环境。我还会考虑结构101 来识别代码库架构中太复杂的位置,所以你知道真正的沼泽地。

理论上,您无法确定地找到未使用的代码。有一个数学证明(嗯,这是一个更一般定理的特例)。如果您好奇,请查找停止问题。

这可以通过多种方式在 Java 代码中体现出来:

  • 根据用户输入、配置文件、数据库条目等加载类;
  • 加载外部代码;
  • 将对象树传递给第三方库;
  • ETC。

话虽这么说,我使用 IDEA IntelliJ 作为我选择的 IDE,它具有广泛的分析工具,用于查找模块、未使用的方法、未使用的成员、未使用的类等之间的依赖关系。它也非常智能,就像未调用的私有方法被标记为未使用,但公共方法需要更广泛的分析。

在Eclipse Goto Windows>中偏好> Java>编译器>错误/警告结果 并将所有这些更改为错误。修复所有错误。这是最简单的方法。美妙的是,这将允许您在编写时清理代码。

截图Eclipse代码:

IntelliJ具有代码分析工具,用于检测未使用的代码。您应该尝试尽可能多地创建非公共字段/方法/类,这将显示更多未使用的方法/字段/类

我还会尝试找到重复的代码,以减少代码量。

我的最后一个建议是尝试查找开源代码,如果使用它将使您的代码更简单。

Structure101 切片视角将列出一个列表(和任何“孤儿”的依赖图。或“orphan 群组”没有依赖于或来自“main”的类或包的类簇。

DCD不是某些IDE的插件,但可以从ant或独立运行。它看起来像一个静态工具和它可以做PMD和FindBugs无法做到的事情。我会尝试的。

P.S。如下面的评论所述,该项目现在位于 GitHub

有一些工具可以分析代码并提供代码覆盖率数据。这使您可以看到(代码运行时)调用了多少。您可以使用任何这些工具来了解您拥有多少孤儿代码。

  • FindBugs 非常适合此类事情。
  • PMD(Project Mess Detector)是另一个可以使用的工具。

然而,两者都找不到 公共静态方法 工作区中未使用的内容。如果有人知道这样的工具,请告诉我。

用户覆盖工具,例如EMMA。但它不是静态工具(即它需要通过回归测试实际运行应用程序,并通过所有可能的错误情况,这是,嗯,不可能:))

尽管如此,EMMA非常有用。

代码覆盖工具,例如Emma,Cobertura和Clover,将检测您的代码并通过运行一系列测试来记录它的哪些部分被调用。这非常有用,应该是您开发过程中不可或缺的一部分。它将帮助您确定测试套件对代码的覆盖程度。

然而,这与识别真实死代码不同。它仅识别测试覆盖(或未覆盖)的代码。这可能会给你误报(如果你的测试不包括所有场景)以及漏报(如果你的测试访问的代码实际上从未在现实场景中使用过)。

我认为真正识别死代码的最佳方法是在实时运行环境中使用覆盖工具检测代码,并在较长时间内分析代码覆盖率。

如果你在负载均衡的冗余环境中运行(如果没有,为什么不呢?)那么我认为仅对仪器的一个实例进行检测并配置负载均衡器是有意义的,这样随机但很小,部分用户在已检测的实例上运行。如果你在很长一段时间内这样做(为了确保你已经涵盖了所有真实世界的使用场景 - 这种季节性变化),你应该能够确切地看到你的代码的哪些区域在真实世界的使用下被访问以及哪些部分被访问真的从来没有被访问,因此死代码。

我从来没有亲眼见过这一点,也不知道上述工具如何用于检测和分析未通过测试套件调用的代码 - 但我相信它们可以。

有一个Java项目 - 死代码检测器(DCD)。对于源代码,它似乎不能很好地工作,但对于.jar文件 - 它真的很好。另外,您可以按类和方法进行过滤。

Netbeans 这里是Netbeans的插件死码检测器

如果它可以链接并突出显示未使用的代码会更好。您可以在此投票和评论:错误181458 - 查找未使用的公共类,方法,字段

Eclipse可以显示/突出显示无法访问的代码。 JUnit可以向您显示代码覆盖率,但您需要进行一些测试,并且必须确定相关测试是否缺失或代码是否真的未使用。

我找到了Clover覆盖工具,它可以编写代码并突出显示所使用和未使用的代码。与Google CodePro Analytics不同,它也适用于WebApplications(根据我的经验,我可能对Google CodePro不正确)。

我注意到的唯一缺点是它不考虑Java接口。

我使用Doxygen开发一个方法调用映射来定位从未调用过的方法。在图表上,您将找到没有调用者的方法集群的孤岛。这不适用于库,因为您需要始终从某个主入口点开始。

scroll top