SonarQube 自定义规则开发
SonarQube 自定义规则开发
满足一些特定需求的时候,需要自己开发代码规则。
环境
和前文的演示环境一致。
步骤
开发步骤见 Writing Custom Java Rules 101,这是官方提供的 sonar-java 下面的指导文档,简述了怎么开发一个 Java 自定义规则。
文章的开始,给了一个模板地址 java-custom-rules,可以看到这个项目下还有别的语言模板。
把模板下载到本地,开发在 Windows 下面完成
F:\workspace\java-custom-rules
编译
mvn clean package
把生成的文件放在 $SONAR_HOME/extensions/plugins
目录,重启 SonarQube,可以看到 Java 下面多了 MyCompany Custom Repository 仓库,下面有新增的规则。
注意:想要看到这个效果必须已经安装 SonarJava 插件。
我们已经看到了自定义规则,接下来添加一个自定义检查规则,按照文档一步一步走,最终我们添加/修改了以下代码
创建 F:\workspace\java-custom-rules\src\test\files\MyFirstCustomCheck.java
文件,用于单元测试,这将是被扫描的代码
class MyClass {
MyClass(MyClass mc) { }
int foo1() { return 0; }
void foo2(int value) { }
int foo3(int value) { return 0; } // Noncompliant
Object foo4(int value) { return null; }
MyClass foo5(MyClass value) {return null; } // Noncompliant
int foo6(int value, String name) { return 0; }
int foo7(int ... values) { return 0;}
}
创建单元测试代码 F:\workspace\java-custom-rules\src\test\java\org\sonar\samples\java\checks\MyFirstCustomCheckTest.java
package org.sonar.samples.java.checks;
import org.junit.Test;
import org.sonar.java.checks.verifier.JavaCheckVerifier;
public class MyFirstCustomCheckTest {
@Test
public void test() {
JavaCheckVerifier.verify("src/test/files/MyFirstCustomCheck.java", new MyFirstCustomCheck());
}
}
创建检查规则 F:\workspace\java-custom-rules\src\main\java\org\sonar\samples\java\checks\MyFirstCustomCheck.java
package org.sonar.samples.java.checks;
import com.google.common.collect.ImmutableList;
import org.sonar.check.Priority;
import org.sonar.check.Rule;
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
import org.sonar.plugins.java.api.semantic.Symbol.MethodSymbol;
import org.sonar.plugins.java.api.semantic.Type;
import org.sonar.plugins.java.api.tree.MethodTree;
import org.sonar.plugins.java.api.tree.Tree;
import org.sonar.plugins.java.api.tree.Tree.Kind;
import java.util.List;
@Rule(
key = "MyFirstCustomCheck",
name = "Return type and parameter of a method should not be the same",
description = "For a method having a single parameter, the types of its return value and its parameter should never be the same.",
priority = Priority.CRITICAL,
tags = {"bug"})
public class MyFirstCustomCheck extends IssuableSubscriptionVisitor {
@Override
public void visitNode(Tree tree) {
if (method.parameters().size() == 1) {
MethodSymbol symbol = method.symbol();
Type firstParameterType = symbol.parameterTypes().get(0);
Type returnType = symbol.returnType().type();
if (returnType.is(firstParameterType.fullyQualifiedName())) {
reportIssue(method.simpleName(), "Never do that! 01!");
}
}
}
@Override
public List<Kind> nodesToVisit() {
return ImmutableList.of(Kind.METHOD);
}
}
将我们自定义的规则添加到规则列表中,修改 F:\workspace\java-custom-rules\src\main\java\org\sonar\samples\java\RulesList.java
文件
public static List<Class<? extends JavaCheck>> getJavaChecks() {
return Collections.unmodifiableList(Arrays.asList(
SpringControllerRequestMappingEntityRule.class,
AvoidAnnotationRule.class,
AvoidBrandInMethodNamesRule.class,
AvoidMethodDeclarationRule.class,
AvoidSuperClassRule.class,
AvoidTreeListRule.class,
MyCustomSubscriptionRule.class,
SecurityAnnotationMandatoryRule.class,
MyFirstCustomCheck.class)); # 添加我们的规则
}
再次编译
mvn clean package
把生成的文件放在 $SONAR_HOME/extensions/plugins
目录,重启 SonarQube,可以看到我们添加的规则,自定义规则开发完毕
验证自定义规则
创建新的规则配置,只将我们添加自定义规则设置为检查项,步骤截图
创建项目验证自定义规则,和之前的扫描测试一样,在 Linux 服务器上执行
mkdir -p /usr/local/sonarqube/workspace/custom && cd /usr/local/sonarqube/workspace/custom
项目代码只有一个 MyFirstCustomCheck.java
,就是前边用于单元测试的代码
class MyClass {
MyClass(MyClass mc) { }
int foo1() { return 0; }
void foo2(int value) { }
int foo3(int value) { return 0; } // Noncompliant
Object foo4(int value) { return null; }
MyClass foo5(MyClass value) {return null; } // Noncompliant
int foo6(int value, String name) { return 0; }
int foo7(int ... values) { return 0;}
}
创建扫描配置文件 sonar-project.properties
sonar.projectKey=custom
sonar.sources=.
sonar.host.url=http://192.168.10.227:9000
sonar.login=c4765957e5ada82ebe21a7c2e1f56afbff4059d3
sonar.language=java
sonar.java.binaries=.
sonar.sourceEncoding=UTF-8
执行扫描
sonar-scanner
自定义规则生效了
SonarQube 自定义规则开发的更多相关文章
- SonarQube学习(五)- SonarQube之自定义规则使用
一.前言 古人云:"欲速则不达",最近真的是深有体会.学习也是如此,不是一件着急的事,越是着急越不会. 就拿SonarQube来说吧,去年年末就想学来着,但是想着想着就搁置了,有时 ...
- 【JSP】自定义标签开发入门
JSP 自定义标签 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时We ...
- javaweb学习总结(二十三)——jsp自定义标签开发入门
一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...
- javaweb(二十三)——jsp自定义标签开发入门
一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...
- Vue 3自定义指令开发
本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 什么是指令(directive) 在Angular和Vue中都有Direct ...
- Java自定义注解开发
一.背景 最近在自己搞一个项目时,遇到可需要开发自定义注解的需求,对于没有怎么关注这些java新特性的来说,比较尴尬,索性就拿出一些时间,来进行研究下自定义注解开发的步骤以及使用方式.今天在这里记下, ...
- jQquery.validate自定义规则的使用案例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(三)
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2340661.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(四)
http://www.cnblogs.com/StoneGarden/archive/2012/02/08/2343294.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
随机推荐
- 数据可视化之PowerQuery篇(十二)客户购买频次分布
https://zhuanlan.zhihu.com/p/100070260 商业数据分析通常都可以简化为对数据进行筛选.分组.汇总的过程,本文通过一个实例来看看PowerBI是如何快速完成整个过程的 ...
- bzoj4582[Usaco2016 Open]Diamond Collector
bzoj4582[Usaco2016 Open]Diamond Collector 题意: n个钻石,每个都有一个大小,现在将其装进2个盒子里,每个盒子里的钻石最大的与最小的大小不能超过k,问最多能装 ...
- Python Ethical Hacking - BeEF Framework(2)
Basic BeEF commands: Login the BeEF Control Panel, and go to Commands page. Create Alert Dialog: Run ...
- canvas : 几个入门需要的基本概念
这段时间做项目需要用canvas. 而我在看文档的时候,发现canvas是一个很独立的API:和DOM BOM基本上没什么关系. 在学习canvas的时候需要了解很多概念,否则看某些文档的讲解可能会看 ...
- layui 魔改:上传时的真实进度条
这个问题本身不复杂,难点在于需要改 layui 的源码. HTML略. 网页的JS域: layui.use(['upload','element','layer'], function(){ var ...
- 【日常摘要】- RabbitMq实现延时队列
简介 什么是延时队列? 一种带有延迟功能的消息队列 过程: 使用场景 比如存在某个业务场景 发起一个订单,但是处于未支付的状态?如何及时的关闭订单并退还库存? 如何定期检查处于退款订单是否已经成功退款 ...
- linux命令笔记记录(自用)
1.解除yum锁定: sudo rm -rf /var/run/yum.pid 2.删除文件夹: rm -rf /var/log/httpd/access 3.更新pip: python -m pip ...
- fgdsafhak
- html标签集合
---恢复内容开始--- 基础 <!DOCTYPE>,<html>,<title>,<body>,<h1>to<h6>,< ...
- 【高并发】高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!
写在前面 周末,跟阿里的一个朋友(去年晋升为P9了)聊了很久,聊的内容几乎全是技术,当然了,两个技术男聊得最多的话题当然就是技术了.从基础到架构,从算法到AI,无所不谈.中间又穿插着不少天马行空的想象 ...