如何在Java项目中find未使用/死的代码

你用什么工具在大的Java项目中find未使用/死的代码? 我们的产品已经开发了好几年了,手工检测不再使用的代码变得非常困难。 然而,我们尽可能多地删除未使用的代码。

一般战略/技术(特定工具除外)的build议也受到赞赏。

编辑:请注意,我们已经使用代码覆盖工具(Clover,IntelliJ),但这些帮助不大。 死代码仍然有unit testing,并显示为覆盖。 我猜想一个理想的工具可以识别代码集群,这些代码很less有其他代码取决于它,允许文档手动检查。

我将仪表运行的系统,以保持代码的使用日志,然后开始检查不使用几个月或几年的代码。

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

当然,如果你在方法层面上,你应该牢记性能。 例如,这些方法只能logging他们的第一次使用。 我不知道这是如何在Java中最好的。 我们在Smalltalk中这样做,它是一种dynamic语言,因此允许在运行时修改代码。 我们使用日志调用对所有方法进行处理,并在第一次logging方法后卸载日志logging代码,因此一段时间后不会再出现性能损失。 也许类似的事情可以用Java静态布尔标志完成…

一个运行良好的Eclipse插件是Unused Code Detector 。

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

CodePro最近由Google与Eclipse项目一起发布。 它是免费的,非常有效的。 该插件具有“ 查找死代码 ”function,具有一个/多个入口点。 工作得很好。

在Eclipse中,我曾经在一个单独的课程中知道一件事,那就是将其所有方法都改为私有方法,然后看看我得到的是什么抱怨。 对于使用的方法,这会引发错误,并将其返回到我可以访问的最低访问级别。 对于未使用的方法,这将引发关于未使用的方法的警告,然后可以删除这些警告。 作为一个奖励,你经常会发现一些可以而且应该被私下化的公共方法。

但是这是非常手动的。

我很惊讶ProGuard在这里没有提到。 它是最成熟的产品之一。

ProGuard是一个免费的Java类文件收缩器,优化器,混淆器和预校验器。 它检测并删除未使用的类,字段,方法和属性。 它优化字节码并删除未使用的指令。 它使用短无意义的名称重命名剩余的类,字段和方法。 最后,它预先validation了Java 6或Java Micro Edition的处理代码。

ProGuard的一些用途是:

  • 创build更紧凑的代码,更小的代码归档,更快的跨networking传输,更快的加载和更小的内存占用。
  • 制作程序和库很难进行反向工程。
  • 列出死代码,所以可以从源代码中删除。
  • 对Java 6或更高版本的现有类文件进行redirect和预validation,以充分利用其更快的类加载。

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

Emma和Eclemma会给你很好的报告,说明在任何给定的代码运行中运行什么类的百分比。

我们已经开始使用“ 查找错误”来帮助识别我们的代码目标丰富的重构环境中的一些问题。 我还会考虑Structure 101来识别代码库的架构中太复杂的地方,所以你知道真正的沼泽在哪里。

理论上,你不能确定性地find未使用的代码。 这是一个mathcertificate(这是一个更一般的定理的特例)。 如果您好奇,请查看停机问题。

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

  • 根据用户input,configuration文件,数据库条目等加载类;
  • 加载外部代码;
  • 将对象树传递给第三方库;
  • 等等

这就是说,我使用IDEA IntelliJ作为我select的IDE,它有丰富的分析工具,用于模块之间的findign依赖关系,未使用的方法,未使用的成员,未使用的类等。它非常聪明,就像一个私有方法,标记未使用,但公开的方法需要更广泛的分析。

Structure101 切片透视图将给出与“主”集群无关的类或包的任何“孤儿”或“孤立组 ”的列表(和依赖关系图)。

IntelliJ有代码分析工具,用于检测未使用的代码。 你应该尝试尽可能多的领域/方法/类非公开的,并会出现更多的未使用的方法/领域/类

我也会尝试find重复的代码作为减less代码量的一种方法。

我最后的build议是尝试find开放的源代码,如果使用将使您的代码更简单。

在Eclipse中转到Windows>首选项> Java>编译器>错误/警告
并将其全部更改为错误。 修复所有的错误。 这是最简单的方法。 美丽的是,这将允许您在编写代码时清理代码。

Eclipse代码:

在这里输入图像说明

有一些工具可以分析代码并提供代码覆盖率数据。 这可以让你看到(如代码运行)有多less被调用。 你可以得到任何这些工具来找出你有多less孤儿代码。

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

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

不过,EMMA非常有用。

代码覆盖率工具(如Emma,Cobertura和Clover)将会testing您的代码,并通过运行一组testing来logging它的哪些部分被调用。 这是非常有用的,应该是你的开发过程中不可或缺的一部分。 它将帮助您确定testing套件覆盖您的代码的程度。

但是,这与识别真正的死码不一样。 它只能识别被testing覆盖(或不覆盖)的代码。 这可以给你误报(如果你的testing不覆盖所有场景)以及错误的否定(如果你的testing访问实际上从未在真实世界场景中使用的代码)。

我想,真正识别死代码的最好方法是在实时运行的环境中使用覆盖工具来testing代码,并在较长一段时间内分析代码覆盖率。

如果你运行在一个负载均衡的冗余环境中(如果不是的话,为什么不呢?),那么我认为只应用一个应用程序实例是有意义的,并且configuration你的负载平衡器,使得随机但很小的您的用户在您的已插装实例上运行。 如果你长时间这样做(为了确保你已经覆盖了所有的真实世界的使用场景 – 这样的季节性变化),你应该能够确切地看到你的代码的哪些部分在真实世界的使用情况下被访问,哪些部分真的从来没有访问过,因此死代码。

我从来没有亲眼见过这样做,也不知道上述工具是如何被用来testing和分析没有通过testing套件调用的代码的,但是我相信他们可以。

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

但是,也不能find在工作区中未使用的公共静态方法 。 如果有人知道这样的工具,那么请让我知道。

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

如果可以链接并突出显示未使用的代码,会更好。 您可以在这里投票和评论: Bug 181458 – 查找未使用的公开课程,方法,领域

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

我发现了三叶草覆盖工具,其中仪器代码和突出显示使用和未使用的代码。 与Google CodePro Analytics不同,它也适用于WebApplications(根据我的经验,我可能对Google CodePro不正确)。

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

有一个Java项目 – 死码检测器 (DCD)。 对于源代码,它似乎不能很好地工作,但对于.jar文件来说,它确实不错。 另外,你可以按类和方法过滤。

我使用Doxygen来开发一个方法调用映射来定位从未被调用的方法。 在图上你会发现没有调用者的方法簇的岛屿。 这对于库不起作用,因为你总是需要从某个主入口点开始。