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

Jos*_*non 112 java static-analysis code-coverage

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

我对各种各样感兴趣

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

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

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

Gre*_*tes 69

对于静态分析工具,我经常使用CPD,PMD,FindBugsCheckstyle.

CPD是PMD"复制/粘贴检测器"工具.我使用PMD一会儿之前,我注意到了"查找重复的代码"链接上的PMD的网页.

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

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

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

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

/absolute-path/filename:line-number:column-number: warning(tool-name): message
Run Code Online (Sandbox Code Playgroud)

这通常被称为"Emacs格式",但即使您不使用Emacs,它也是统一报告的合理格式.例如:

/project/src/com/example/Foo.java:425:9: warning(Checkstyle):Missing a Javadoc comment.
Run Code Online (Sandbox Code Playgroud)

我的警告格式转换由我的Ant脚本和Ant 过滤链完成.

我做的第二个"整合"是警告抑制.默认情况下,每个工具都支持您可以放置​​在代码中的注释或注释(或两者),以使您要忽略的警告静音.但是这些各种警告抑制请求没有一致的外观,看起来有些愚蠢.当你抑制警告时,你是在抑制警告,所以为什么不总是写" SuppressWarning?"

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

// SuppressWarnings(PMD.PreserveStackTrace) justification: (false positive) exceptions are chained
Run Code Online (Sandbox Code Playgroud)

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

@SuppressWarnings("PMD.CompareObjectsWithEquals") // justification: identity comparision intended
Run Code Online (Sandbox Code Playgroud)

类似地,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")
Run Code Online (Sandbox Code Playgroud)

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


Ken*_*Liu 16

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

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

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

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

  • 连续性很糟糕,哈德森规则. (3认同)

Bri*_*ise 11

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

  • 测试 - JUnit/TestNG
  • 代码分析 - FindBugs,PMD
  • 代码覆盖 - 三叶草

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

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

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

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


Ste*_*eod 9

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

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

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


Mik*_*one 5

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