118

您在 Java 项目中使用哪些代码分析工具?

我对各种感兴趣

  • 静态代码分析工具(FindBugs、PMD 和任何其他工具)
  • 代码覆盖工具(Cobertura、Emma 等)
  • 任何其他基于仪器的工具
  • 还有什么,如果我错过了什么

如果适用,还要说明您使用的构建工具以及这些工具与您的 IDE 和构建工具的集成程度。

如果工具仅以特定方式可用(作为 IDE 插件,或者说,构建工具插件),那么该信息也值得注意。

4

12 回答 12

72

对于静态分析工具,我经常使用 CPD、PMDFindBugsCheckstyle

CPD 是 PMD“复制/粘贴检测器”工具。在我注意到PMD 网页上的“查找重复代码”链接之前,我使用 PMD 有一段时间了。

我想指出,这些工具有时可以扩展到它们“开箱即用”的规则集之外。不仅仅是因为它们是开源的,因此您可以重写它们。其中一些工具带有允许它们扩展的应用程序或“钩子”。例如,PMD 带有允许您创建新规则的“设计器”工具。此外,Checkstyle 具有DescendantToken检查,该检查具有允许大量自定义的属性。

我将这些工具与基于 Ant 的构建集成在一起。您可以点击链接查看我评论的配置。

除了与构建的简单集成之外,我发现将工具配置为以其他几种方式进行某种“集成”很有帮助。即报告生成和警告抑制的一致性。我想在这个讨论中添加这些方面(可能也应该有“静态分析”标签):人们如何配置这些工具来创建一个“统一”的解决方案?(我在这里单独问过这个问题)

首先,对于警告报告,我转换了输出,使每个警告都具有简单的格式:

/absolute-path/filename:line-number:column-number: warning(tool-name): message

这通常被称为“Emacs 格式”,但即使您不使用 Emacs,它也是一种用于同质化报告的合理格式。例如:

/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.

我的警告格式转换是由我的 Ant 脚本和 Ant filterchains 完成的。

我做的第二个“整合”是为了警告抑制。默认情况下,每个工具都支持注释或注释(或两者),您可以将它们放在代码中以使您想忽略的警告静音。但是这些各种警告抑制请求并没有一致的外观,这似乎有些愚蠢。当你抑制警告时,你正在抑制警告,所以为什么不总是写“ SuppressWarning?”

例如,PMD 的默认配置禁止NOPMD在注释中带有字符串“”的代码行上生成警告。此外,PMD 支持 Java 的@SuppressWarnings注解。我将 PMD 配置为使用包含“”的注释,SuppressWarning(PMD.而不是NOPMD使 PMD 抑制看起来相似。我填写了使用注释样式抑制时违反的特定规则:

// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained

只有 " SuppressWarnings(PMD." 部分对注释很重要,但它与 PMD 对@SuppressWarning通过名称识别个别规则违规的注释的支持一致:

@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended

类似地,Checkstyle 抑制注释对之间的警告生成(不提供注释支持)。默认情况下,关闭和打开 Checkstyle 的注释分别包含字符串CHECKSTYLE:OFFCHECKSTYLE:ON。更改此配置(使用 Checkstyle 的“SuppressionCommentFilter”)以使用字符串“ BEGIN SuppressWarnings(CheckStyle.”和“ END SuppressWarnings(CheckStyle.”使控件看起来更像 PMD:

// BEGIN SuppressWarnings(Checkstyle.HiddenField) justification: "Effective Java," 2nd ed., Bloch, Item 2
// END SuppressWarnings(Checkstyle.HiddenField)

对于 Checkstyle 注释,特定的检查违规 ( HiddenField)重要,因为每个检查都有自己的 " BEGIN/END" 注释对。

FindBugs 还支持带有@SuppressWarnings注释的警告生成抑制,因此无需进一步配置即可实现与其他工具的某种程度的一致性。不幸的是,Findbugs 必须支持自定义@SuppressWarnings注解,因为内置 Java@SuppressWarnings注解的SOURCE保留策略不够强大,无法将注解保留在 FindBugs 需要的类文件中。我完全限定了 FindBugs 警告抑制以避免与 Java 的@SuppressWarnings注释冲突:

@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")

这些技术使不同工具的事情看起来相当一致。请注意,让每个警告抑制都包含字符串“ SuppressWarnings”可以轻松运行简单搜索以查找整个代码库中所有工具的所有实例。

于 2008-09-17T04:02:23.067 回答
17

我使用 Cobertura、Checkstyle、(Ecl)Emma 和 Findbugs 的组合。

EclEmma是一个很棒的Eclipse 插件,它通过在编辑器中着色 java 源代码来显示代码覆盖率(截图)——覆盖率是通过运行 JUnit 测试生成的。当您试图找出特定类中涵盖了哪些行,或者如果您想查看单个测试涵盖了哪些行时,这非常有用。这比生成报告然后查看报告以查看哪些类的覆盖率低得多的用户友好和有用得多。

Checkstyle 和 Findbugs Eclipse 插件也很有用,它们会在您键入时在编辑器中生成警告。

Maven2 具有报告插件,可与上述工具一起在构建时生成报告。我们使用它来获取整体项目报告,这在您需要汇总数字时更有用。这些是由我们使用Continuum运行的 CI 构建生成的。

于 2008-10-29T18:55:44.697 回答
12

我们在 Maven 2.x 构建和 Eclipse/RAD 7 中使用和集成以下所有内容:

  • 测试 - JUnit/TestNG
  • 代码分析 - FindBugs, PMD
  • 代码覆盖率 - Clover

此外,在我们的 Maven 构建中,我们有:

  • 依赖
  • 标签检查器(TODO、FIXME 等)

此外,如果您使用的是 Maven 2.x,CodeHaus 在他们的Mojo 项目中有一系列方便的 Maven 插件。

注意:Clover 与 Bamboo CI 服务器开箱即用集成(因为它们都是 Atlassian 产品)。FindBugs、PMD 和 CheckStyle 也有 Bamboo 插件,但如前所述,免费的 Hudson CI 服务器也有这些插件。

于 2008-08-16T18:48:43.267 回答
9

我使用 IntelliJ IDEA 内置的静态分析。完美融合。

我使用 Intellij IDEA 内置的代码覆盖率(基于 EMMA)。再次,完美融合。

与拼凑来自不同供应商的工具相比,这种集成解决方案可靠、强大且易于使用。

于 2008-09-17T14:40:53.610 回答
5

Checkstyle是我在以前的公司用过的另一个……它主要用于样式检查,但它也可以做一些静态分析。此外,Clover用于代码覆盖,但请注意它不是免费工具。

于 2008-08-07T07:18:26.710 回答
4

我们使用 FindBugs 和 Checkstyle 以及 Clover 进行代码覆盖。

我认为进行某种静态分析以支持您的开发很重要。不幸的是,这些工具的重要性仍未得到广泛传播。

于 2008-08-07T07:21:49.230 回答
1

我们使用与 Ant 集成的 FindBugs 和 JDepend。我们使用 JUnit,但我们没有使用任何覆盖工具。

我没有将它集成到 Rational Application Developer(我用来开发 J2EE 应用程序的 IDE)中,因为我喜欢在 Windows 控制台中运行 javac 时它看起来多么整洁。:P

于 2008-08-07T00:20:41.750 回答
1

我在 Cobertura 上运气不错。它是一个代码覆盖工具,可以作为正常构建的一部分通过您的 ant 脚本执行,并且可以集成到 Hudson 中。

于 2008-09-17T04:31:07.223 回答
1

我们的团队使用 PMD 和 Cobertura,实际上我们的项目是 maven 项目,包含用于代码分析的插件非常简单。真正的问题是您需要使用哪个分析的特定项目,我认为您不能为每个项目使用相同的插件。

于 2008-09-17T14:46:25.623 回答
1

在我们的项目中,我们在 checkstyle、pmd.... 前面使用 Sonar 以及 CI(Bamboo、Hudson),我们还获得了关于我们的源质量和指导的很好的历史。我确实喜欢 Sonar,因为您是 CI Stack 中的一个中心工具,可以为您完成这项工作,并且您可以轻松自定义每个项目的规则。

于 2010-08-29T09:56:05.497 回答
1

结构 101擅长代码分析和查找循环包依赖关系。

于 2011-09-17T06:59:00.177 回答
0

我正在寻找许多答案来了解新工具并将这些知识整合到一个问题/线程中,所以我怀疑这个问题会有 1 个真正的答案。

我对自己的问题的回答是我们使用:

  • Findbugs 查找常见错误错误/编码 - 从 maven 运行,并且还可以轻松集成到 Eclipse 中
  • Cobertura 用于我们的报道报告 - 从 maven 运行

Hudson 还有一个任务扫描器插件,可以显示你的 TODO 和 FIXME 的数量,以及它们在源文件中的位置。

在我们的案例中,所有这些都与 Maven 1.x 集成并与 Hudson 绑定,后者在签到时运行我们的构建以及每晚和每周的额外内容。Hudson 趋势图绘制了我们的 JUnit 测试、覆盖率、查找错误以及打开的任务。还有一个 Hudson 插件可以报告和绘制我们的编译警告。我们还使用 Hudson plots 插件进行了几项性能测试,它们有自己的性能和内存使用图表。

于 2008-08-08T14:53:12.293 回答