你的Java项目使用哪些代码分析工具?
你在Java项目中使用哪些代码分析工具?
我对各种感兴趣
- 静态代码分析工具(FindBugs,PMD和其他)
- 代码覆盖工具(Cobertura,Emma和其他)
- 任何其他基于工具的工具
- 别的什么,如果我失去了一些东西
如果适用,还请说明您使用的构build工具以及这些工具与IDE和构build工具的集成程度。
如果一个工具只有一种特定的方式(作为一个IDE插件,或者说一个构build工具插件),那么这个信息也是值得注意的。
对于静态分析工具,我经常使用CPD, PMD , FindBugs和Checkstyle 。
CPD是PMD“复制/粘贴检测器”工具。 在我注意到PMD网页上的“查找重复代码”链接之前,我使用了一段时间的PMD 。
我想指出的是,这些工具有时可以扩展到“开箱即用”的规则之外。 而不仅仅是因为它们是开源的,所以你可以重写它们。 其中一些工具带有可扩展的应用程序或“挂钩”。 例如,PMD带有“devise器”工具 ,允许您创build新的规则。 此外,Checkstyle具有DescendantToken检查,该检查具有允许大量定制的属性。
我将这些工具与基于Ant的构build集成在一起。 您可以按照链接查看我的评论configuration。
除了简单的集成到构build之外,我发现将这些工具configuration成在几个其他方面有所“集成”是有帮助的。 即报告生成和警告抑制的一致性。 我想将这些方面添加到这个讨论中(也许应该有“静态分析”标签):人们如何configuration这些工具来创build一个“统一”的解决scheme? (我在这里单独提出这个问题)
首先,对于警告报告,我转换输出,以便每个警告具有简单的格式:
/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 过滤链完成的 。
我所做的第二个“整合”是警告抑制。 默认情况下,每个工具都支持您可以放置在代码中的注释或注释(或两者兼有),以使您想要忽略的警告无效。 但是,这些各种警告抑制请求并没有一致的外观,这似乎有些愚蠢。 当你压制一个警告,你压制一个警告,所以为什么不总是写“ SuppressWarning
?”
例如,PMD的默认configuration会禁止在注释中使用string“ NOPMD
”的代码行生成警告。 另外,PMD支持Java的@SuppressWarnings
注释。 我将PMDconfiguration为使用包含“ 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抑制注释对之间的警告生成(不提供注释支持)。 默认情况下,closures和打开Checkstyle的注释分别包含stringCHECKSTYLE:OFF
和CHECKSTYLE:ON
。 更改此configuration(使用Checkstyle的“SuppressionCommentFilter”)以使用string“ 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
注释来抑制警告生成,因此不需要进一步的configuration就可以实现与其他工具的一致性。 不幸的是,Findbugs必须支持自定义的@SuppressWarnings
注释,因为内置的Java @SuppressWarnings
注释的SOURCE
保留策略不够强大,无法保留FindBugs需要的类文件中的注释。 为了避免与Java的@SuppressWarnings
注释冲突,我完全限定了FindBugs的警告抑制:
@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR")
这些技术使得各种工具看起来合理一致。 请注意,使每个警告抑制都包含string“ SuppressWarnings
”可以轻松地运行简单的search,以便在整个代码库中查找所有工具的所有实例。
我使用了Cobertura,Checkstyle,(Ecl)Emma和Findbugs的组合。
EclEmma是一个非常棒的 Eclipse插件,它通过在编辑器( 屏幕截图 )中对java源着色来显示代码覆盖率 – 覆盖率是通过运行JUnittesting生成的。 当你试图找出某个特定类中的哪些行被覆盖,或者你想看到哪一行被一个单独的testing所覆盖时,这是非常有用的。 与生成报告然后查看报告以查看哪些类别的覆盖率较低相比,这更方便用户使用。
Checkstyle和Findbugs Eclipse插件也很有用,它们在编辑器中input时会产生警告。
Maven2的报表插件可以与上述工具一起在编译时生成报表。 我们用这个来获得整体的项目报告,当你需要总数时这些报告更有用。 这些是由我们使用Continuum运行的CI构build生成的。
以下所有我们在Maven 2.x构build和Eclipse / RAD 7中使用和集成easiy:
- testing – JUnit / TestNG
- 代码分析 – FindBugs,PMD
- 代码覆盖 – 三叶草
另外,在我们的Maven构build中,我们有:
- JDepend
- 标记检查器(TODO,FIXME等)
另外,如果你使用的是Maven 2.x,CodeHaus在他们的Mojo项目中有一些方便的Maven插件。
注意:Clover与Bamboo CI服务器进行了开箱即用的集成(因为它们都是Atlassian产品)。 还有一些FindBugs,PMD和CheckStyle的插件,但是正如所指出的,免费的Hudson CI服务器也有这些插件。
我使用IntelliJ IDEA内置的静态分析。 完美的整合
我使用Intellij IDEA内置的代码覆盖率(基于EMMA)。 再次,完美的整合。
与将各个供应商的工具拼凑在一起相比,这种集成的解决scheme可靠,function强大且易于使用。
Checkstyle是另一个我曾经使用过的公司…这主要是用于样式检查,但它也可以做一些静态分析。 此外, 三叶草代码覆盖,但要知道这不是一个免费的工具。
我们使用FindBugs和Checkstyle以及Clover来进行代码覆盖。
我认为有一些静态分析很重要,可以支持你的开发。 不幸的是,这些工具还是很重要的。
我们使用FindBugs和JDepend与Ant集成。 我们使用JUnit,但是我们没有使用任何覆盖工具。
我没有使用它集成到Rational Application Developer(我用来开发J2EE应用程序的IDE),因为我喜欢在Windows控制台中运行javac时看起来多么整洁。 :P
我已经和Cobertura好运了。 这是一个代码覆盖的工具,可以通过您的ant脚本执行,作为您的常规构build的一部分,可以集成到哈德逊。
我们的团队使用PMD和Cobertura,实际上我们的项目是maven项目,并且包含用于代码分析的插件非常简单。 真正的问题是针对需要使用哪个分析的具体项目,我的意见是,你不能为每个项目使用相同的插件。
在我们的项目中,我们使用Sonar在checkstyle,pmd ….和CI(Bamboo,Hudson)之前,我们也获得了我们的源质量的一个很好的历史和我们去的指导。 我喜欢Sonar,因为CI Stack中的一个中心工具可以帮你实现,而且你可以很容易地为每个项目定制规则。
结构101擅长代码分析和查找循环包相关性。
我正在寻找很多答案来学习新的工具,并将这些知识整合到一个问题/线程中,所以我怀疑这个问题是否会有一个真正的答案。
我对自己的问题的回答是,我们使用:
- Findbugs寻找常见的错误/编码 – 从maven运行,也很容易集成到Eclipse中
- 我们的覆盖报告Cobertura – 从maven运行
哈德森还有一个任务扫描器插件,将显示您的TODO和FIXME的数量,以及显示它们在源文件中的位置。
所有这些都与Maven 1.x集成在我们的案例中,并绑定到Hudson,它在办理登机手续时运行我们的构build以及每晚和每周的额外事情。 哈德森趋势图我们的JUnittesting,覆盖面,findbugs,以及开放的任务。 还有一个哈德森插件报告和graphics我们的编译警告。 我们还使用Hudson绘图插件随着时间的推移使用他们自己的性能和内存使用图进行了几次性能testing。