在 SonarQube 上使用 SpotBugs 插件

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

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

SpotBugs SonarQube 插件 使用了主要的 SpotBugs 插件,例如 fb-contrib 和 Find Security Bugs。不过,如果你想使用其他 SpotBugs 插件,就需要自行构建 SonarQube 插件。关于 SonarQube 插件的详细要求,请参阅 SonarQube 官方指南。

创建 Maven 项目

请按照 SonarQube 官方指南 中的说明进行操作。建议使用子模块,以便在同一个项目中同时管理 SpotBugs 插件和 SonarQube 插件。你可以参考 该模块 作为示例。

你还需要配置 sonar-packaging-maven-plugin,使你的插件依赖于 SpotBugs SonarQube 插件。例如,如果你使用的是 SonarQube 6.7 LTS,你的插件需要 SpotBugs SonarQube 插件 3.7 版本,因此你的配置应如下所示:

<configuration>
  <basePlugin>findbugs</basePlugin>
  <requirePlugins>findbugs:3.7</requirePlugins>
  ...
</configuration>

生成 rules.xml

SonarQube 无法理解 SpotBugs 提供的 Bug Pattern 元数据,因此我们需要将 findbugs.xml 和 messages.xml 转换为名为 rules.xml 的 SonarQube 格式。

如果你的 SpotBugs 插件并不复杂,可以直接引入 SonarQube 规则 XML 生成器 Maven 插件 来生成 rules.xml。请按照 其 README 中的说明 进行操作。

更新 RulesDefinition.java

你的 SonarQubeRulesDefinition.java 应当将生成的 rules.xml 加载到 FindBugs 仓库中。

在创建 NewRepository 实例时,请使用 FindbugsRulesDefinition.REPOSITORY_KEY 作为仓库键,并且 不要 通过调用 NewRepository#setName(String) 来重命名它。这是满足 SonarQube API 要求的必要条件。以下是一个示例:

@Override
public void define(Context context) {
  NewRepository repository =
      context.createRepository(FindbugsRulesDefinition.REPOSITORY_KEY, Java.KEY);

  RulesDefinitionXmlLoader ruleLoader = new RulesDefinitionXmlLoader();
  ruleLoader.load(
      repository,
      getClass().getResourceAsStream(
          "/path/to/rules.xml"),
      "UTF-8");
  repository.done();
}

更新 Plugin.java

Plugin.java 应该是一个简单的实现,只需加载你的 RulesDefinition 类即可。下面是一个示例:

@Override
public void define(Context context) {
  context.addExtensions(Arrays.asList(SonarQubeRulesDefinition.class));
}

部署到 SonarQube

mvn package 将生成一个可作为 SonarQube 插件使用的 .jar 文件。请按照 SonarQube 官方指南 将其部署到 SonarQube 上。

请注意,你需要在 SonarQube 的配置文件中手动启用新规则,否则分析时不会使用新添加的规则。

评论

登录后参与评论

正在加载评论…