检测重复代码的工具(Java)

我在一个项目中,以前的程序员已经遍地都是复制粘贴代码。 这些代码实际上是相同的(或非常相似),它们可以被重构为一个。

我花了无数个小时手动重构这些代码,但是我认为必须有更好的方法。 有些是非常微不足道的静态方法,可能已经被转移到祖先类(而是复制粘贴由以前的初级程序员遍布)。

是否有一个代码分析工具,可以检测到这一点,并提供报告/build议? 如果可能,我更喜欢免费/开源工具。

我使用以下工具:

  • PMD / CPD (BSD风格许可证)。
  • Checkstyle (LGPL许可证) – 支持已被删除, 请参阅详细信息 。

这两个工具都有代码重复检测支持。 但他们都缺乏build议你如何重构你的代码的能力。

JetBrains IntelliJ IDEA Ultimate具有良好的代码重复支持的静态代码分析,但它不是免费的。

SonarQube可以检测重复的代码,但不build议删除它们。 它是免费的 – 虽然默认设置,它只能检测词法上相同的克隆 – 有一个免费的SonarQube插件的CodeAnalyzer ,你可以检测到更复杂的结构克隆,而不是词法。

维基百科有关重复代码工具的文章中列出的大多数工具将检测包括Java在内的许多不同语言的重复。

无论是Simian还是PMD的CPD 。 前者支持更多的语言,但对于商业项目来说是免费的。

请参阅我们的SD Java CloneDR ,这是一种用于在大型Java系统中检测精确和差错重复代码的工具。

尽pipe有空白变化,换行符,注释插入删除,常量或标识符的修改,并且在很多情况下甚至用另一个语句或一个语句块来replace一个语句,CloneDR仍将查找代码克隆。

它显示了每个克隆集的位置,每个克隆,具有共同共性的克隆的抽象以及抽象的参数化,以显示每个克隆实例如何从抽象派生。

它在大多数Java系统中发现10-20%的克隆。