您将哪些代码分析工具用于Java项目?

您将哪些代码分析工具用于Java项目?

What code analysis tools do you use for your Java projects?

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

我对各种感兴趣

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

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

如果仅以特定方式(例如,IDE插件或构建工具插件)提供工具,则该信息也值得注意。


对于静态分析工具,我经常使用CPD,PMD,FindBugs和Checkstyle。

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

我想指出的是,有时这些工具可以扩展到其"开箱即用"的规则之外。不仅仅是因为它们是开源的,所以您可以重写它们。这些工具中的一些随应用程序或"挂钩"一起提供,可以对其进行扩展。例如,PMD附带了"设计器"工具,使您可以创建新规则。另外,Checkstyle具有DescendantToken检查,该检查具有允许进行大量自定义的属性。

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

除了简单地集成到构建中之外,我发现还可以通过其他几种方式将工具配置为某种程度的"集成"。即,报告生成和警告抑制的一致性。我想在讨论中添加这些方面(可能还应该带有" static-analysis"标签):人们如何配置这些工具以创建"统一"解决方案? (我在这里已经单独问过这个问题)

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

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

这通常称为" Emacs格式",但是即使您没有使用Emacs,它也是用于均匀化报告的一种合理格式。例如:

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

我的警告格式转换是通过Ant脚本和Ant过滤链完成的。

我要做的第二个"集成"是为了抑制警告。默认情况下,每个工具都支持注释或注释(或两者),您可以在代码中放置注释或注释,以使要忽略的警告静音。但是,这些各种警告抑制请求的外观不一致,看上去有些愚蠢。禁止显示警告时,就是禁止显示警告,为什么不总是写" SuppressWarning"呢?

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

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

只有" SuppressWarnings(PMD."部分对注释很重要,但与PMD对@SuppressWarning注释的支持一致,该注释确实通过名称识别了违反规则的情况:

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

同样,Checkstyle禁止在注释对之间生成警告(不提供注释支持)。默认情况下,用于打开和关闭Checkstyle的注释分别包含字符串CHECKSTYLE:OFFCHECKSTYLE:ON。更改此配置(使用Checkstyle的" SuppressionCommentFilter")以使用字符串" BEGINSuppressWarnings(CheckStyle."和" ENDSuppressWarnings(CheckStyle."使控件看起来更像PMD:

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

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

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

1
@edu.umd.cs.findbugs.annotations.SuppressWarnings("UWFFIELDNOTINITIALIZEDINCONSTRUCTOR")

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


我将Cobertura,Checkstyle,(Ecl)Emma和Findbugs结合使用。

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

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

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


以下所有我们都在Maven 2.x构建和Eclipse / RAD 7中使用并轻松集成到其中:

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

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

  • 依赖
  • 标记检查器(TODO,FIXME等)

此外,如果您使用的是Maven 2.x,则CodeHaus在其Mojo项目中有一组方便的Maven插件。

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


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

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

与将不同供应商的工具拼凑在一起相比,此集成解决方案可靠,强大且易于使用。


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


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

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


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


在我们的项目中,我们在Checkstyle,pmd ....之前使用了Sonar,再加上CI(Bamboo,Hudson),我们也获得了关于源质量和发展方向的良好历史。我之所以喜欢Sonar,是因为您是CI堆栈中的一个中央工具,可以为您完成此任务,并且您可以轻松自定义每个项目的规则。


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


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


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

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


我正在寻找许多答案来学习新工具并将这些知识整合到一个问题/线程中,因此我怀疑该问题是否会有1个真正的答案。

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

  • Findbugs查找不良错误/编码错误-从Maven运行,并且还轻松集成到Eclipse中
  • Cobertura提供的覆盖率报告-从Maven运行

Hudson还具有一个任务扫描程序插件,该插件将显示您的TODO和FIXME的计数,并显示它们在源文件中的位置。

在我们的案例中,所有这些都与Maven 1.x集成在一起,并与Hudson捆绑在一起,Hudson会在签入以及每晚和每周的其他工作中运行我们的构建。 Hudson趋势图显示了我们的JUnit测试,覆盖率,findbug和开放任务。还有一个Hudson插件可以报告和绘制我们的编译警告。我们还使用Hudson plots插件进行了一些性能测试,这些测试带有自己的性能和内存使用情况随时间变化的图表。


推荐阅读