sonarQube的自定义规则开发【详细教程】

官网Demo演示插件开发地址:

https://docs.sonarqube.org/display/PLUG/Writing+Custom+Java+Rules+101

基于官网的我暂时不多说,基础框架按照官网的范例进行搭建即可

#开源地址:

https://github.com/tigerge000/sonar-java-custom-rules.git

sonar常用方法说明

范例

需求:【强制】抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;。实现:

AbstractClassNameCheck:

package org.sonar.samples.java.checks.namerules;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.check.Rule;
import org.sonar.plugins.java.api.JavaFileScanner;
import org.sonar.plugins.java.api.JavaFileScannerContext;
import org.sonar.plugins.java.api.tree.BaseTreeVisitor;
import org.sonar.plugins.java.api.tree.ClassTree;

/**
 * 抽象类命名检查
 * 抽象类命名使用 Abstract 或 Base 开头
 *
 * @author cxq
 */
@Rule(key = "AbstractClassNameCheck_java.html")
public class AbstractClassNameCheck extends BaseTreeVisitor implements JavaFileScanner {
    private static final Logger LOGGER = LoggerFactory.getLogger(AbstractClassNameCheck.class);

    private JavaFileScannerContext context;

    @Override
    public void scanFile(JavaFileScannerContext javaFileScannerContext) {
        this.context = javaFileScannerContext;
        scan(context.getTree());
    }

    @Override
    public void visitClass(ClassTree tree) {
        String className = tree.simpleName().name();
        LOGGER.info(className + "<<>>" + tree.symbol().isAbstract());
        if (tree.symbol().isAbstract()) {
            //判断名称是否以Abstract 或 Base 开头
            String abName = "Abstract";
            String bsName = "Base";
            //判断类名如果小于Abstract 或 Base
            if (className.length() < abName.length() || className.length() < bsName.length()) {
                context.reportIssue(this, tree, "The Name Of Abstract Class should use Abstract or Base first");
            } else {
                //判断是否存在 Abstract 或 Base
                if (!className.contains(abName)) {
                    if (!className.contains(bsName)) {
                        context.reportIssue(this, tree, "The Name Of Abstract Class should use Abstract or Base first");
                    } else {
                        if (className.indexOf(bsName) != 0) {
                            context.reportIssue(this, tree, "The Name Of Abstract Class should use Abstract or Base first");
                        }
                    }
                } else {
                    if (className.indexOf(abName) != 0) {
                        context.reportIssue(this, tree, "The Name Of Abstract Class should use Abstract or Base first");
                    }
                }
            }
        }
        super.visitClass(tree);
    }

}

resources目录下添加目录:

AbstractClassNameCheck_java.html》》展示用

AbstractClassNameCheck Check

Noncompliant Code Example

    public abstract class HiClass {// Noncompliant
    }

    public abstract class MyNameIsAbstract {// Noncompliant
    }

Compliant Solution》》正确写法

    public abstract class AbstractMysql {
    }

    public abstract class BaseMysql {
    }

 

AbstractClassNameCheck_java.json

{
  "title": "The Name Of Abstract Class should use Abstract or Base first",
  "status": "ready",
  "remediation": {
    "func": "Constant\/Issue",
    "constantCost": "5min"
  },
  "tags": [
    "bug",
    "pitfall"
  ],
  "defaultSeverity": "CRITICAL"
}

 

新建测试类:

AbstractClassNameCheckTest

package org.sonar.samples.java.checks;

import org.junit.Test;
import org.sonar.java.checks.verifier.JavaCheckVerifier;
import org.sonar.samples.java.checks.namerules.AbstractClassNameCheck;

public class AbstractClassNameCheckTest {
    @Test
    public void test() {
        JavaCheckVerifier.verify("src/test/files/AbstractClassNameCheck.java", new AbstractClassNameCheck());
    }

}

sonarQube的自定义规则开发【详细教程】_第1张图片

 

 

结构:sonarQube的自定义规则开发【详细教程】_第2张图片

此时,我们已完成第一个自定义规则的实现,并将其注册到自定义插件中。最后剩下的步骤是使用SonarQube平台直接测试它并尝试分析项目! 

首先使用maven构建项目

目录:\sonar-custom-rules-examples-master\java-custom-rules> 执行:mvn clean install

打包成功后:

[INFO] Building jar: ***\java-custom-rules\target\java-custom-rules-1.0-SNAPSHOT.jar

讲jar包放入

$SONAR_HOME/extensions/plugins

重启sonarQube

./sonar.sh  restart

启动后SonarQube以管理员身份登录并导航到“ 代码规则” 选项卡。

从那里,在语言部分下,选择“ Java ”,然后选择存储库部分下的 “ MyCompany Custom Repository ” 。 您的规则现在应该是可见的(包含所有其他示例规则)。 

选择规则并在默认质量配置文件中激活它。

sonarQube的自定义规则开发【详细教程】_第3张图片

如何配置:

质量配置》java新建配置》my-java

sonarQube的自定义规则开发【详细教程】_第4张图片

 

激活更多规则

sonarQube的自定义规则开发【详细教程】_第5张图片

活动

 

sonarQube的自定义规则开发【详细教程】_第6张图片

 

sonarQube的自定义规则开发【详细教程】_第7张图片

已经打开成功。测试一次我们自己定义的规则

新建两个测试类:

sonarQube的自定义规则开发【详细教程】_第8张图片

sonar-scanner  这里如果不清楚,请自己学习 scanner检测代码,我这里就直接运行了。

发现新的bug

sonarQube的自定义规则开发【详细教程】_第9张图片

sonarQube的自定义规则开发【详细教程】_第10张图片

我们自定义的规则已经实现

sonarQube的自定义规则开发【详细教程】_第11张图片

 

 

 

 

你可能感兴趣的:(sonar)