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

我对各种都感兴趣

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

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

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

有帮助吗?

解决方案

对于静态分析工具我经常使用CPD, PMD, 查找错误, , 和 格子风格.

CPD 是 PMD“复制/粘贴检测器”工具。我使用 PMD 一段时间后才注意到 “查找重复代码”链接PMD 网页.

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

我将这些工具与 基于 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 完成的 过滤器链.

我做的第二个“集成”是为了警告抑制。默认情况下,每个工具都支持注释或注释(或两者),您可以将它们放置在代码中以消除您想要忽略的警告。但这些不同的警告抑制请求没有一致的外观,这看起来有些愚蠢。当你抑制警告时,你就是抑制警告,所以为什么不总是写“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" 可以轻松地运行简单的搜索来查找整个代码库中所有工具的所有实例。

其他提示

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

埃克艾玛 是一个 惊人的 Eclipse 插件,通过在编辑器中对 java 源代码进行着色来显示代码覆盖率(截屏) - 覆盖率是通过运行 JUnit 测试生成的。当您试图找出特定类中覆盖了哪些行,或者您想查看单个测试覆盖了哪些行时,这非常有用。这比生成报告然后查看报告以查看哪些类的覆盖率较低更加用户友好和有用。

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

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

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

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

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

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

此外,如果您使用 Maven 2.x,CodeHaus 在其目录中提供了一系列方便的 Maven 插件 Mojo项目.

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

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

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

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

格子风格 这是我在以前的公司使用过的另一个...它主要用于样式检查,但也可以进行一些静态分析。还, 三叶草 对于代码覆盖率,但请注意它不是免费工具。

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

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

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

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

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

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

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

结构101 擅长代码分析,寻找循环包依赖。

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

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

  • Findbugs 用于查找常见错误 bad/coding - 从 Maven 运行,并且还可以轻松集成到 Eclipse 中
  • Cobertura 用于我们的覆盖报告 - 由 Maven 运行

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top