您为Java项目使用了哪些代码分析工具?

时间:2008-08-06 22:45:28

标签: java code-coverage static-analysis

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

我对各种感兴趣

  • 静态代码分析工具(FindBugs,PMD和其他任何工具)
  • 代码覆盖工具(Cobertura,Emma和其他任何人)
  • 任何其他基于仪器的工具
  • 其他任何事情,如果我遗失了什么

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

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

12 个答案:

答案 0 :(得分:67)

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

CPD是PMD“复制/粘贴检测器”工具。在我注意到"Finding Duplicated Code" link上的PMD web page之前,我正在使用PMD一段时间。

我想指出的是,这些工具有时可以超出其“开箱即用”的规则范围。而且不仅仅是因为它们是开源的,因此您可以重写它们。其中一些工具带有应用程序或“挂钩”,可以扩展它们。例如,PMD附带"designer" tool,允许您创建新规则。此外,Checkstyle的DescendantToken检查具有允许进行大量自定义的属性。

我将这些工具与an Ant-based build集成在一起。您可以点击该链接查看我的评论配置。

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

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

/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”可以轻松运行简单搜索,以查找整个代码库中所有工具的所有实例。

答案 1 :(得分:16)

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

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

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

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

答案 2 :(得分:11)

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

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

此外,在我们的Maven版本中,我们有:

  • JDepend
  • 标签检查器(TODO,FIXME等)

此外,如果您使用的是Maven 2.x,CodeHaus会在Mojo project中添加一些便捷的Maven插件。

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

答案 3 :(得分:9)

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

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

与拼接各个供应商的工具相比,这种集成解决方案可靠,功能强大且易于使用。

答案 4 :(得分:4)

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

答案 5 :(得分:3)

我们正在使用FindBugs和Checkstyle以及Clover代码覆盖率。

我认为进行某种静态分析非常重要,支持您的开发。不幸的是,这些工具很重要,但仍然没有广泛传播。

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

在我们的项目中,我们在checkstyle前面使用Sonar,pmd ....与CI(Bamboo,Hudson)一起,我们也获得了源代码质量的良好历史以及指导我们的目标。我喜欢Sonar,因为CI堆栈中的一个中心工具可以为您完成,您可以轻松自定义每个项目的规则。

答案 10 :(得分:1)

Structure 101擅长代码分析并找到循环包依赖项。

答案 11 :(得分:0)

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

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

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

Hudson还有一个任务扫描程序插件,它会显示你的TODO和FIXME的数量,并显示它们在源文件中的位置。

在我们的案例中,所有内容都与Maven 1.x集成在一起,并与Hudson绑定,后者在办理登机手续时运行我们的构建以及每晚和每周额外的事情。 Hudson趋势图表显示了我们的JUnit测试,覆盖范围,findbugs以及开放任务。还有一个Hudson插件可以报告和绘制我们的编译警告。我们还使用Hudson图插件,在一段时间内使用自己的性能和内存使用图进行了多次性能测试。