实现 SpotBugs 插件

qianmoQqianmoQ· 更新于 2026-09-30· 阅读 9 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

实现 SpotBugs 插件

创建 Maven 项目

使用 spotbugs-archetype <https://github.com/spotbugs/spotbugs-archetype>_ 创建 Maven 项目。
接着 Maven archetype 插件会提示你决定插件的 groupId、artifactId、包名和初始版本。

$ mvn archetype:generate \
      -DarchetypeArtifactId=spotbugs-archetype \
      -DarchetypeGroupId=com.github.spotbugs \
      -DarchetypeVersion=0.2.3

编写 Java 代码来表示要查找的 Bug

在生成的项目中,你可以找到一个名为 BadCase.java 的文件。

更新此文件以表示要查找的目标 Bug。

如果需要表示多种模式,请在 src/test/java 目录中添加更多类。

编写测试用例以确保检测器能发现 Bug

在生成的项目中,你还可以找到另一个名为 MyDetectorTest.java 的文件。

此测试中的 spotbugs.performAnalysis(Path) 会使用你的插件运行 SpotBugs,并返回所有发现的 Bug(此处该方法的第一个参数是从 BadCase.java 编译而来的 class 文件路径)。

你可以使用 BugInstanceMatcher 来验证你的插件是否按预期发现了 Bug。

目前此测试应该会失败,因为我们还没有更新检测器本身。

编写 Java 代码以避免误报

为避免误报,最好确保在哪些情况下检测器不应发现 Bug。

在项目中更新 GoodCase.java,并表示此类情况。

之后,在 MyDetectorTest.java 中添加一个测试方法,以验证从该 GoodCase 类中未发现任何 Bug。

如果需要表示多种模式,请在 src/test/java 目录中添加更多类。

更新检测器以通过所有单元测试

现在你已经有了测试来确保检测器能按预期工作。

待补充

应选择哪个父类

AnnotationDetector

用于分析类、字段、方法及方法参数上注解的基类检测器。

BytecodeScanningDetector

分析类文件中 Java 字节码的基础检测器。

OpcodeStackDetector

BytecodeScanningDetector 的子类,可以扫描方法的字节码并使用 operand stack。

更新 findbugs.xml

SpotBugs 会读取每个插件中的 findbugs.xml 来查找检测器与缺陷。
因此,当你添加新的检测器时,需要像下面这样添加新的 <Detector> 元素:

<Detector class="com.github.plugin.MyDetector" reports="MY_BUG" speed="fast" />

还需要添加 <BugPattern>,用于描述你的缺陷模式的类型与类别。

<BugPattern type="MY_BUG" category="CORRECTNESS" />

你可以在生成的 Maven 项目 src/main/resources 目录中找到 findbugs.xml。

更新 messages.xml

SpotBugs 会读取每个插件中的 messages.xml,以构造用于报告检测到的缺陷的人类可读消息。
它还支持从 messages_ja.xml、messages_fr.xml 等文件中读取本地化消息。

你可以在生成的 Maven 项目 src/main/resources 目录中找到 messages.xml。

更新检测器的消息

在 <Detector> 元素中,你可以添加检测器的描述消息。请注意,该消息必须为纯文本,不支持 HTML。

<Detector class="com.github.plugin.MyDetector">
<Details>
  Original detector to detect MY_BUG bug pattern.
</Details>
</Detector>

更新 Bug 模式的消息

在 <BugPattern> 元素中,你可以添加 bug 模式的描述消息。
共有三种类型的消息:

ShortDescription

bug 模式的简短描述。用于向用户说明其意图和性质。
应为纯文本,不支持 HTML。

LongDescription

bug 模式的较长描述。
你可以使用形如 {0}(从 0 开始编号)的占位符,然后加入到 BugInstance 中的数据会被插入到该位置。
因此,这个 LongDescription 适合用来说明所检测到的 bug 的详细信息。

应为纯文本,不支持 HTML。

Details

bug 模式的详细描述。应为 HTML 格式,因此适合配合表格、列表和代码片段来说明详细的规范或示例。

<BugPattern type="MY_BUG">
    <ShortDescription>Explain bug pattern shortly.</ShortDescription>
    <LongDescription>
        Explain existing problem in code, and how developer should improve their implementation.
    </LongDescription>
    <Details>
        <![CDATA[
    <p>Explain existing problem in code, and how developer should improve their implementation.</p>
  ]]>
    </Details>
</BugPattern>

评论

登录后参与评论

正在加载评论…