Checkstyle与PMD

我们正在将静态分析工具引入到我们的Java产品的构build系统中。 我们正在使用Maven2,所以Checkstyle和PMD整合是免费的。 不过,就强制执行基本样式规则而言,这两个工具在function上有很大的重叠。

利用这两种方法是否有好处? 如果一个人工作,我不想维护2个工具。 如果我们select一个,我们应该使用哪一个,为什么?

我们也计划使用FindBugs。 还有其他静态分析工具,我们应该看看?

更新:共识似乎是PMD比CheckStyle更受欢迎。 我没有看到使用两者的可靠理由,而且我也不想保留2套规则文件,所以我们可能会专门针对PMD。 我们还将引入FindBugs,也许最终还会引入Macker来执行体系结构规则。

你一定要使用FindBugs 。 根据我的经验,假阳性率很低,甚至是报告中最不重要的警告值得在一定程度上解决。

至于Checkstyle与PMD,我不会使用Checkstyle,因为它几乎只涉及风格。 以我的经验,Checkstyle将报告大量完全不相关的事情。 另一方面,PMD也能够指出可疑的编码实践,其输出通常更具相关性和实用性。

这两个软件都很有用。 Checkstyle将通过检查您的编码风格(如花括号,命名等)来帮助您进行编程。简单的事情,但非常多!

PMD将通过检查更复杂的规则来帮助你,比如devise类时,或者更为特殊的问题,例如正确实现克隆函数。 简单地说,PMD将检查你的编程风格

但是,这两个软件都遭受类似的规则,有时不好解释。 使用错误的configuration,你可能会检查两次或两次相反的事情,即“删除无用的构造函数”和“总是一个构造函数”。

如果我们select一个,我们应该使用哪一个,为什么?

这些工具不是互相竞争,而是互补的,应该同时使用。

会议types(Checkstyle)是让人们一起工作,释放自己的创造力的胶水,而不是花费时间和精力去理解不一致的代码。

Checkstyle示例:

  • 公共方法有javadoc吗?
  • 该项目是否遵循Sun命名约定?
  • 代码是用一致的格式编写的吗?

而PMD提醒你不良做法:

  • 没有做任何事情捕捉exception
  • 已经死了代码
  • 太复杂的方法
  • 直接使用实现而不是接口
  • 在不使用不等于(Object object)方法的情况下实现hashcode()方法

来源: http : //www.sonarsource.org/what-makes-checkstyle-pmd-findbugs-and-macker-complementary/

我们使用两个:

  • Checkstyle以确保团队中的每个人都以类似的方式编写代码
  • PMD查找有问题的代码区域和下一个重构目标

如果你的主要使用地点是在eclipse中开发,那么来自Instantiations的CodePro将是最好的。 此前它是一个商业工具,但现在Google购买Instantiations,所以CodePro analytix现在是免费的。

查看http://code.google.com/javadevtools/download-codepro.html

如果您查看了Checkstyle,PMD和Findbugs规则列表,您已经看到所有三个都提供了有价值的输出,所有三个在一定程度上重叠,并且也带来了他们自己的独特规则。 这就是为什么像Sonar这样的工具使用这三个。

也就是说,Findbugs具有最具体的或小生境的规则(例如“可疑的IllegalMonitorStateException的捕获” – 你多久可能遇到这个问题?),所以它可以在很less或者没有configuration的情况下使用,并且应该认真对待它的警告。 通过Checkstyle和PMD,这些规则更加通用和风格相关,所以它们只能与自定义configuration文件一起使用,以使团队免受雪崩的不相关的反馈(“第5行的Tab char”,第6行的“Tab char” “第7行的标签字符”…你得到的图片)。 他们还提供强大的工具来编写自己的高级规则,例如Checkstyle DescendentToken规则。

当使用全部三种(特别是像Sonar这样的工具时),所有这些都应该单独configuration(至less需要几天时间才能覆盖所有规则),同时注意防止重复(所有三个工具都检测到hashCode例如重写和equals()不)。

总而言之,如果您认为静态代码分析是有价值的,那么拒绝三者中的任何一个都没有意义,但要使用这三者,您必须投入时间来configuration它们,以提供可用的反馈。

这两个工具都是可configuration的,可以做几乎相同的事情。 也就是说,如果我们谈论的是开箱即​​用的东西,那么就有很多重叠,但是也有不同的规则/检查。 例如,Checkstyle有更强大的支持来检查Javadoc并find一些神奇的数字。 此外,Checkstyle有一个“导入控制”function,看起来类似于Macker的function(我还没有使用过Macker)。

如果有一些对您来说很重要的事情,那么Checkstyle不是PMD所不具备的开箱即用function,那么您可能会考虑只使用这些检查的最小Checkstyleconfiguration。 然后制定Checkstyleconfiguration无法增长的策略,只需在执行与自定义PMD规则类似的function时删除检查。

还要考虑如果您决定Checkstyle“导入控制”function涵盖了您想要的Macker,那么您可以实现PMD / Checkstyle而不是PMD / Macker。 无论哪种方式,这是两个工具,但与Checkstyle,你会得到的东西,PMD不是开箱即用的“免费”。

Checkstyle和PMD都擅长检查编码标准,并且易于扩展。 但PMD有额外的规则来检查圈复杂度,Npath复杂度等,这使您可以编写健康的代码。

使用PMD的另一个优点是CPD(复制/粘贴检测器)。它发现跨项目的代码重复,不受限于JAVA,也适用于JSP。 Neal Ford在度量驱动的敏捷开发方面有很好的演讲,讲述了许多有助于Java / Java EE开发的工具

我发现Checkstyle和PMD是强制执行样式问题和简单明显的编码错误的最佳select。 虽然我发现我喜欢使用Eclipse和所有的警告,它提供了更好的目的。 我们通过使用共享偏好来强制执行,并将其标记为实际错误。 这样,他们从来没有得到检查在首位。

我强烈build议使用FindBugs。 因为它在字节码级别工作,所以它可以检查在源码级别不可能的事情。 虽然它公开分享垃圾,但在我们的代码中发现了许多实际的和重要的错误。

有一点我迄今为止还没有看到,IDE的插件会在您的代码上执行CheckStyle规则集,而PMD插件只会报告违规。 例如,在多个编程小组的多站点项目中,积极执行标准非常重要,而不仅仅是报告标准。

这两个工具都有可用于IntelliJ,NetBeans和Eclipse的插件(我认为这涵盖了大部分的用法)。 我不太熟悉NetBeans,所以只能评论IntelliJ和Eclipse。

无论如何,IntelliJ和Eclipse的PMD插件将根据项目代码库中的PMD违例生成报告。

另一方面,CheckStyle插件将突出显示违规行为,并且可以(至less对于IntelliJ,我对Eclipse有较less的经验)被configuration为自动转换一些问题(例如对于“OneStatementPerLine”,将放置CR-LF之间的声明,“NeedBraces”,将添加大括号,他们是失踪等)。 显然,只有更简单的违规行为可以自动修复,但仍然是对遗留项目或位于多个地点的项目的帮助。

PMD的“按需”意味着开发者必须有意识地决定运行报告。 Checkstyle违规会在开发时自动报告给他们。 虽然PMD 确实包含了更广泛的规则集,但在我看来,IDE中的自动embedded/报告违规是值得维护2套规则的麻烦。

因此,对于我工作的任何项目,我们都使用工具,在IDE中执行的Checkstyle,在IDE中报告的PMD,以及通过Jenkins进行报告和测量。

看一下将Checkstyle,PMD,FindBugs和其他一些静态分析器结合在一起的qulice-maven-plugin ,并预先configuration它们。 这种组合的美妙之处在于,您无需在每个项目中单独configuration它们:

<plugin> <groupId>com.qulice</groupId> <artifactId>qulice-maven-plugin</artifactId> <version>0.15</version> <executions> <execution> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> 

我会回应PMD是Java风格/惯例检查的最新产品的评论。 对于FindBugs,许多商业开发组织正在使用Coverity。

我刚开始使用Checkstyle和PMD。 对我而言,PMD更容易为事物创build自定义规则,以便是否存在System.gc(),Runtime.gc(),只要您可以编写XPath Query也不难。 但是,PMD并没有显示出它具有显示列号的function。 所以对于像检查列限制的东西。 你可能想使用Checkstyle。

PMD是我发现更多的人指的。 Checkstyle是4年前人们提到的,但是我相信PMD得到了更持续的维护,而其他IDE /插件select与其合作。

与checkstyles相比,PMD是最好的工具。 Checkstyles可能没有能力分析代码,而PMD提供了许多function来做到这一点! PMD还没有发布关于javadoc,评论,缩进等的规则。顺便说一下,我正在计划实施这些规则……. thanx