Checkstyle与PMD

时间:2008-10-08 19:52:56

标签: java static-analysis findbugs checkstyle pmd

我们正在为我们的Java产品构建系统引入静态分析工具。我们正在使用Maven2,因此CheckstylePMD集成是免费的。然而,就强制执行基本样式规则而言,这两个工具之间的功能似乎存在很大的重叠。

利用这两者有益处吗?我不想维护2个工具,如果一个工作。如果我们选择一个,我们应该使用哪个以及为什么?

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

更新:共识似乎是PMD比CheckStyle更受欢迎。我没有看到使用两者的充分理由,我不想维护2套规则文件,因此我们可能会专门针对PMD。我们还将引入FindBugs,也许最终会引入Macker来执行架构规则。

17 个答案:

答案 0 :(得分:65)

你绝对应该使用FindBugs。根据我的经验,误报率非常低,即使是最不重要的警告也值得在一定程度上解决。

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

答案 1 :(得分:36)

这两种软件都很有用。 Checkstyle将在您的编程过程中通过检查您的编码风格,即大括号,命名等帮助您。简单的事情,但非常多!

PMD将帮助您检查更复杂的规则,例如在设计类时,或者更正常的问题,如正确实现克隆功能。简单地说,PMD将检查您的编程风格

但是,这两个软件都有类似的规则,有时候解释不好。如果配置错误,您可能会检查两次或两次相反的事情,即“删除无用的构造函数”和“始终是一个构造函数”。

答案 2 :(得分:22)

  

如果我们选择一个,我们应该使用哪个以及为什么?

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

常规类型(Checkstyle)是一种粘合剂,它使人们能够一起工作并释放他们的创造力,而不是花时间和精力来理解不一致的代码。

Checkstyle示例:

  • 公共方法上有javadoc吗?
  • 项目是否遵循Sun命名约定?
  • 代码是否采用一致的格式编写?
PMD会让你想起不好的做法:

  • 在不做任何事情的情况下捕获例外
  • 有死码
  • 太多复杂的方法
  • 直接使用实现而不是接口
  • 在没有not equals(Object object)方法的情况下实现hashcode()方法

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

答案 3 :(得分:13)

我们同时使用:

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

答案 4 :(得分:7)

如果您查看了Checkstyle,PMD和Findbugs规则列表,您已经看到所有三个都提供了有价值的输出,并且所有三个都在一定程度上重叠,并且还为表格提供了自己独特的规则。这就是Sonar等工具使用这三种工具的原因。

也就是说,Findbugs有最具体或最小的规则(例如“可疑捕获IllegalMonitorStateException” - 你经常遇到什么?)所以它很少或没有配置可用,它的警告应该被认真对待。使用Checkstyle和PMD,规则更通用且与样式相关,因此它们只应与自定义配置文件一起使用,以免团队遭受大量无关反馈(“第5行的Tab char”,“第6行的Tab char”, “第7行的Tab char”......你得到了图片)。它们还提供了强大的工具来编写您自己的高级规则,例如: Checkstyle DescendentToken规则。

当使用全部三个(特别是像Sonar这样的工具)时,所有这些都应该单独配置(至少需要几天时间来覆盖所有规则),同时注意防止重复(所有三个工具都检测到hashCode( )已被覆盖并且equals()不是,例如)。

总之,如果您认为静态代码分析很有价值,那么拒绝三个提供的任何值都没有意义,但要使用这三个,您必须花时间配置它们以便为您提供有用的反馈。

答案 5 :(得分:7)

如果您的主要使用地点是在eclipse中进行开发,那么实例化中的CodePro将是最佳选择。早些时候它是一个商业工具,但现在谷歌收购了Instantiations,因此CodePro analytix现在免费。

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

答案 6 :(得分:6)

Sonar(http://www.sonarsource.org/)是一个非常有用的开放平台,用于管理代码质量,包括Checkstyle,PMD,Findbugs等等。

这也表明所有3种工具都有权存在......

答案 7 :(得分:5)

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

使用PMD的另一个优点是CPD(复制/粘贴检测器)。它发现跨项目的代码重复,并且不限于JAVA。它也适用于JSP。 Neal Ford在Metrics Driven Agile Development上有一个很好的演示,其中讨论了许多有助于Java / Java EE开发的工具

答案 8 :(得分:4)

我发现Checkstyle和PMD最适合执行样式问题和简单明显的编码错误。虽然我发现我喜欢使用Eclipse以及它为此目的提供的所有警告。我们通过使用共享首选项并将其标记为实际错误来强制执行内容。这样,他们从未首先登记入住。

我强烈和热情地推荐使用FindBugs。因为它在字节码级别工作,所以它可以检查源级别不可能的事情。虽然它会泄露其公平份额的垃圾,但它在我们的代码中发现了许多实际和重要的错误。

答案 9 :(得分:4)

这两种工具都是可配置的,可以做同样的事情。也就是说,如果我们谈论开箱即用的东西,会有很多重叠,但也有不同的规则/检查。例如,Checkstyle更强大地支持检查Javadoc和查找幻数,以命名一对。此外,Checkstyle有一个“导入控制”功能,看起来类似于Macker的功能(我没有使用过Macker)。

如果有一些对您很重要的事情,那么Checkstyle开箱即用的PMD没有,您可能会考虑只使用那些检查的最小Checkstyle配置。然后建立一个Checkstyle配置无法增长的策略,只需在执行类似功能时删除检查,例如自定义PMD规则。

另外考虑一下,如果您确定Checkstyle“导入控件”功能涵盖了Macker所需的功能,那么您可以实现PMD / Checkstyle而不是PMD / Macker。无论哪种方式,它都是两个工具,但使用Checkstyle,你会得到PMD没有开箱即用的东西“免费”。

答案 10 :(得分:3)

10年后...... 在2018年,我使用了Checkstyle,PMD和FindBugs。

FindBugs 开始。也许稍后再添加PMD和Checkstyle。

绝不盲目执行默认规则

步骤:

  • 在具有大量代码的项目上运行一个具有默认规则的工具
  • 使规则适应这个项目,用一些注释评论无用的规则
  • 专注于低挂水果规则(NPE,记录器检查,未公开的资源检查......)
  • 为您觉得有价值的规则执行一些修复(一次一个!)
  • 为每个工具执行此操作,但不是一次完成!
  • 重复此过程

理想情况下,每个项目都可以有单独的规则。 我喜欢通过构建运行规则(通过maven插件),一旦我知道项目通过我定义的所有规则就失败了规则错误。 这迫使开发人员采取行动,因为报告不够。 从那时起,您的项目几乎可以防范,您甚至可以在以后添加更多规则和/或编写自定义规则。

答案 11 :(得分:3)

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

这两个工具都有可用于IntelliJ,NetBeans和Eclipse的插件(在我看来,这涵盖了大多数用法)。我对NetBeans不熟悉,所以只能评论IntelliJ和Eclipse。

无论如何,IntelliJ和Eclipse的PMD插件将在项目代码库中生成有关PMD违规的按需报告。

另一方面,CheckStyle插件会突出显示违规行为,并且可以(至少对于IntelliJ,我对Eclipse的经验较少)配置为自动转换某些问题(例如,对于'OneStatementPerLine',将放置语句之间的CR-LF,对于'NeedBraces',将添加缺少的括号等。)。显然,只有更简单的违规才能自动修复,但它仍然可以帮助遗留项目或位于多个地点的项目。

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

因此,对于我工作的任何项目,我们使用两种工具,在IDE中强制执行Checkstyle,在IDE中报告PMD,以及两者在构建中报告和测量(通过Jenkins)。

答案 12 :(得分:2)

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

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

答案 13 :(得分:1)

我赞同PMD是Java风格/约定检查的最新产品的评论。关于FindBugs,许多商业开发团队正在使用Coverity。

答案 14 :(得分:1)

我刚刚开始使用Checkstyle和PMD。对我来说,PMD更容易为事物创建自定义规则,例如是否存在System.gc(),Runtime.gc(),只要您可以编写XPath查询,这也是一点都不困难。但是,PMD没有告诉我它具有显示列号的功能。对于像检查列限制这样的事情。您可能想使用Checkstyle。

答案 15 :(得分:0)

PMD是我发现更多人所指的东西。 Checkstyle是4年前人们所指的,但我相信PMD的维护更加持续,其他IDE /插件选择使用它。

答案 16 :(得分:-2)

与checkstyles相比,PMD是最好的工具。 Checktyles可能无法分析代码,而PMD提供了许多功能! Offcourse PMD尚未发布javadoc,评论,缩进等规则。顺便说一句,我计划实施这些规则....... thanx