90

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

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

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

更新:共识似乎是 PMD 优于 CheckStyle。我看不出同时使用两者的充分理由,而且我不想维护两组规则文件,因此我们可能会专门针对 PMD。我们还将引入 FindBugs,也许最终还会引入 Macker 来执行架构规则。

4

17 回答 17

78

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

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

于 2008-10-08T20:03:05.743 回答
41

这两个软件都很有用。Checkstyle 将通过检查您的编码风格(即大括号、命名等)在您的编程过程中为您提供帮助。简单但数量众多的事情!

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

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

于 2008-10-08T20:12:17.630 回答
25

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

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

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

检查样式示例:

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

而 PMD 提醒您不良做法:

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

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

于 2011-09-06T15:06:51.197 回答
15

我们同时使用:

  • Checkstyle 确保团队中的每个人都以类似的方式编写代码
  • PMD 查找有问题的代码区域和下一个重构目标
于 2008-10-08T20:12:42.683 回答
7

如果您的主要使用地点是在 Eclipse 中进行开发,那么来自 Instantiations 的 CodePro 将是最好的。早些时候它是一个商业工具,但现在 Google 购买了 Instantiations,因此 CodePro analytix 现在是免费的。

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

于 2010-11-18T18:49:20.707 回答
7

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

也就是说,Findbugs 具有最具体或最特殊的规则(例如“可疑捕获 IllegalMonitorStateException” - 您可能多久遇到一次?)因此它可以在很少或没有配置的情况下使用,并且应该认真对待它的警告。使用 Checkstyle 和 PMD,规则更通用且与样式相关,因此它们只能与自定义配置文件一起使用,以使团队免于大量无关反馈(“第 5 行的 Tab char”、“第 6 行的 Tab char”、 “第 7 行的 Tab char”......你明白了)。它们还提供强大的工具来编写您自己的高级规则,例如 Checkstyle DescendentToken规则。

使用这三个时(尤其是使用 Sonar 之类的工具),应分别配置所有这些(至少需要几天时间才能涵盖所有规则),同时注意防止重复(所有三个工具都检测到 hashCode()例如,被覆盖和 equals() 不是)。

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

于 2011-12-14T10:04:19.577 回答
6

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

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

于 2011-06-25T15:19:08.673 回答
5

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

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

另请考虑,如果您决定 Checkstyle“导入控制”功能涵盖了您希望 Macker 提供的功能,那么您可以实现 PMD/Checkstyle 而不是 PMD/Macker。无论哪种方式,它都是两个工具,但使用 Checkstyle,您将获得 PMD 无法“免费”开箱即用的东西。

于 2008-10-13T23:52:11.367 回答
5

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

使用 PMD 的另一个优点是 CPD(复制/粘贴检测器)。它可以发现跨项目的代码重复,并且不受 JAVA 的限制。它也适用于 JSP。Neal Ford 有一篇关于Metrics Driven Agile Development的精彩演讲,其中谈到了许多有助于 Java/Java EE 开发的工具

于 2009-02-20T09:40:55.247 回答
4

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

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

于 2008-10-08T21:27:25.420 回答
4

10 年后…… 2018 年,我全部使用 Checkstyle、PMD 和 FindBugs。

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

永远不要盲目执行默认规则

脚步:

  • 在具有大量代码的项目上运行具有默认规则的工具
  • 将规则适配到这个项目中,注释掉无用的规则,加上一些注释
  • 专注于低悬的果实规则(NPE、记录器检查、未关闭的资源检查......)
  • 对您认为有价值的规则进行一些修复(一次一个!)
  • 为每个工具执行此操作,但不是一次全部执行!
  • 重复这个过程

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

于 2018-04-26T08:20:30.597 回答
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)。

于 2011-10-24T08:44:41.433 回答
3

看看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>
于 2012-10-23T17:09:27.500 回答
2

我会回应这样的评论,即 PMD 是 Java 样式/约定检查的最新产品。对于 FindBugs,许多商业开发团体都在使用 Coverity。

于 2008-10-08T20:04:15.163 回答
1

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

于 2008-10-08T19:59:25.923 回答
1

我刚刚开始使用 Checkstyle 和 PMD。对我来说,PMD更容易为诸如是否存在System.gc()、Runtime.gc()之类的东西创建自定义规则,只要你会写XPath Query,这也一点都不难。但是,PMD 并没有向我展示它具有显示列号的功能。因此,对于检查列限制之类的事情。您可能想使用 Checkstyle。

于 2015-07-01T18:43:13.290 回答
-2

与 checkstyles 相比,PMD 是最好的工具。Checkstyles 可能不具备分析代码的能力,而 PMD 提供了许多功能来分析代码!Offcourse PMD 尚未发布有关 javadoc、注释、缩进等的规则。顺便说一句,我计划实施这些规则......thanx

于 2010-10-05T07:17:13.590 回答