在 SonarQube 上使用 SpotBugs 插件
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 的配置文件中手动启用新规则,否则分析时不会使用新添加的规则。
评论
登录后参与评论
KnowForge