Checkstyle与PMD


85

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

同时使用这两种方法有好处吗?如果一个工具可以工作,我不想维护两个工具。如果选择一种,应该使用哪一种,为什么?

我们还计划使用FindBugs。还有其他静态分析工具值得我们关注吗?

更新:共识似乎是PMD优于CheckStyle。我看不到有理由同时使用这两种文件,也不想维护2套规则文件,因此我们可能只针对PMD。我们还将引入FindBugs,也许最终引入Macker来实施体系结构规则。

Answers:


69

您绝对应该使用FindBugs。以我的经验,假阳性率很低,即使它报告的最不重要的警告在某种程度上也值得解决。

至于Checkstyle vs. PMD,我不会使用Checkstyle,因为它几乎只涉及样式。以我的经验,Checkstyle将报告大量完全不相关的事情。另一方面,PMD还能指出可疑的编码实践,并且其输出通常更相关和有用。


49
+1用于添加您对FindBugs的推荐。但是,除非您是具有自己特有风格的独狼开发人员,否则我强烈不同意您对Checkstyle的看法。对于团队来说,先商定合理的通用规则子集,然后使用Checkstyle之类的自动化工具自动执行这些规则,则代码将被所有人读取。
约翰·托伯勒

1
虽然并不完美,但FindBugs迄今为止是最好的。PMD和checkstyle会指导您采取彻底的不良做法。要不惜一切代价避免,除非您非常清楚哪些警告有效,哪些警告无效。
DPM 2012年

奇怪的是,我在PMD和Checkstyle的经历恰恰相反。如果是checkstyle或Findbugs找不到,则PMD经常报告误报。7年虽然很重要。
xenoterracide's

38

两种软件都很有用。Checkstyle将通过检查编码风格(例如花括号,命名等)为您提供帮助。

PMD将通过检查更复杂的规则(例如在类设计期间)或解决更特殊的问题(例如正确实现克隆功能)来帮助您。简而言之,PMD将检查您的编程风格

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


9
究竟。恕我直言,它们是两个旨在做不同事情的工具,所以我不确定它们是否具有可比性。如果要在开发团队中实施标准编码风格,请使用Checkstyle。如果要分析代码中的设计问题或不良的编码做法,请使用PMD。
aberrant80

24

如果选择一种,应该使用哪一种,为什么?

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

约定类型(Checkstyle)是使人们能够一起工作并释放创造力的胶水,而无需花费时间和精力来理解不一致的代码。

Checkstyle示例:

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

当PMD提醒您不良做法时:

  • 不执行任何操作即可捕获异常
  • 死代码
  • 太多复杂的方法
  • 直接使用实现而不是接口
  • 在没有not equals(Object object)方法的情况下实现hashcode()方法

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


1
我同意Checkstyle更加关注代码格式,并迫使开发人员遵循“代码标准”,但是它也可以发现很多不良做法,请在此处查看,并且Checkstyle的扩展更易于开发,但是我同意它有局限性,将永远无法克服PMD和FindBug。
Roman Ivanov



7

如果查看Checkstyle,PMD和Findbugs规则列表,您会发现所有这三个都提供了有价值的输出,并且所有三个都在一定程度上重叠,并且也将它们自己的唯一规则带到了表中。这就是为什么像Sonar这样的工具同时使用这三个工具的原因。

就是说,Findbugs具有最具体的规则或利基规则(例如,“ IllegalMonitorStateException的可疑捕获” –您可能会遇到这种情况的频率是多少?),因此几乎没有配置就可以使用它,并且应该认真对待其警告。使用Checkstyle和PMD时,规则更加通用且与样式相关,因此它们仅应与自定义配置文件一起使用,以使团队免受大量无关反馈的影响(“第5行的Tab字符”,“第6行的Tab字符”, “第7行上的Tab字符” ...您得到图片。它们还提供了强大的工具来编写您自己的高级规则,例如Checkstyle DescendentToken规则。

当使用全部三个(尤其是使用Sonar之类的工具)时,应将它们全部单独配置(至少花几天时间才能涵盖所有规则),同时注意防止重复(所有三个工具都检测到hashCode()已被覆盖,而equals()则不是)。

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


6

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

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


5

两种工具都是可配置的,并且可以完成几乎相同的操作。就是说,如果我们谈论的是开箱即​​用的东西,会有很多重叠,但是也有不同的规则/检查。例如,Checkstyle对检查Javadoc和查找幻数有更强的支持,仅举几例。此外,Checkstyle具有“导入控件”功能,该功能看上去与Macker的功能类似(我没有使用Macker)。

如果有些重要的事情让Checkstyle开箱即用,而PMD却没有,您可以考虑仅使用那些检查的最小Checkstyle配置。然后制定一个Checkstyle配置无法增长的策略,只需在使用自定义PMD规则实现类似功能时删除检查即可。

还要考虑一下,如果您确定Checkstyle的“导入控制”功能涵盖了Macker想要的功能,则可以实现PMD / Checkstyle而不是PMD / Macker。无论哪种方式,它都是两个工具,但是使用Checkstyle时,您将获得PMD不会“免费”开箱即用的功能。


5

Checkstyle和PMD都擅长检查编码标准,并且易于扩展。但是PMD还有其他规则可以检查循环复杂度,Npath复杂度等,从而可以编写健康的代码。

使用PMD的另一个优势是CPD(复制/粘贴检测器),它可以发现跨项目的代码重复并且不受Java的限制,它也适用于JSP。尼尔·福特(Neal Ford)在“度量驱动的敏捷开发”上做了精彩的演讲,其中谈到了许多对Java / Java EE开发有用的工具。



4

我发现Checkstyle和PMD最适合执行样式问题和简单的明显的编码错误。尽管我发现我喜欢使用Eclipse及其所有警告,但为此目的它提供了更好的选择。我们通过使用共享首选项并将其标记为实际错误来强制执行操作。这样一来,他们永远不会被检入。

我强烈建议您使用FindBugs。因为它在字节码级别上起作用,所以它可以检查在源代码级别上不可能的事情。尽管它浪费了大量的垃圾,但它在我们的代码中发现了许多实际和重要的错误。


4

十年后...在2018年,我将全部使用Checkstyle,PMD和FindBugs。

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

切勿盲目执行默认规则

脚步:

  • 在具有大量代码的项目上运行具有默认规则的工具
  • 修改规则以适应该项目,注释掉无用的规则并附带一些注释
  • 专注于低落的成果规则(NPE,记录器检查,未封闭资源检查...)
  • 对您认为有价值的规则进行一些修复(一次一个!)
  • 为每个工具执行此操作,但不能一次完成所有操作!
  • 重复这个过程

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


仅供参考,SpotBugs是“ FindBugs的精神继任者”,并且SpotBugs文档非常好。据我所知,FindBugs多年没有更新。
Skomisa '18年

从未听说过SpotBugs,可能是因为FindBugs + fbcontrib已经足够了很长时间,所以很高兴知道有一些替代产品
Christophe Roussy


还值得注意的是,工具往往具有可配置的敏感性。例如,从FindBugs / SpotBugs开始时,您可能需要选择一个高阈值以仅捕获最严重的错误,然后在修复问题后降低该阈值。
ThrawnCA '18

@ThrawnCA是的,但即使很敏感:在大型项目中,会发现在合理的时间内修复了太多错误。因此,我要做的是一次添加一条规则,从最低限度的成果(例如潜在的NP检测)开始,然后继续发展诸如未封闭资源的规则。
Christophe Roussy

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中自动执行违规行为/报告违规行为值得维护两套规则。

所以对于我,我们使用这两种工具的工作的任何项目,Checkstyle的在IDE中执行,PMD报道IDE和两个报告和建立(通过詹金斯)测量。


1
还有一些方法可以将其集成到构建中并使其在违反时失败(例如,使用maven)。我已经为Checkstyle,PMD和FindBugs完成了此操作。正如您所说,报告还不够。
Christophe Roussy '18

3

看一下结合了Checkstyle,PMD,FindBugs和其他一些静态分析器的qulice-maven-plugin,并对其进行了预配置。这种组合的好处在于,您不需要在每个项目中都单独配置它们:

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

如何配置它以获取报告(某种可用格式)?现在,即使我配置了log4j,它也只会将其吐到控制台上。我看到有一个可能与之相关的错误报告,但我不确定。
亚当·阿罗德

我们在想同样的方法,但是为了修复它,我需要在代码或类似内容中突出显示它。至少你的settings.jar帮助。
亚当·阿罗德

2

我想回应一下PMD是Java样式/约定检查的最新产品。关于FindBugs,许多商业开发小组正在使用Coverity。


1

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


2
在2008年是正确的,但是今天Checkstyle的速度加快了。
barfuin

1

我刚刚开始使用Checkstyle和PMD。对我而言,只要您可以编写XPath查询,那么PMD为诸如是否存在System.gc(),Runtime.gc()之类的事物创建自定义规则会更加容易。但是,PMD尚未向我显示它具有显示列号的功能。因此,对于诸如检查列限制之类的事情。您可能想使用Checkstyle。


-2

与checkstyles相比,PMD是最好的工具。当PMD提供许多功能时,Checkstyle可能无法分析代码!Offcourse PMD尚未发布有关Javadoc,注释,缩进等的规则。通过我计划实施这些规则的方式…….thanx


关于checkstyle的一件好事是它允许使用一些灵活的规则,例如RegexpSingleline ...
Jigar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.