编写SonarQube自定义Java和Xml规则

持国天王
• 阅读 11916

因为工作需要最近接触到了SonarQube,需要根据项目自定义Java和Xml规则,由于国内的资料实在是比较少,并且官网的资料全是英文的,看起来实在是头疼,所以希望写点资料能够帮助到其他人。
官网地址:https://www.sonarqube.org
在此感谢hu_qingen (古月随笔) 和 冯澍雨 提供的帮助

基本思路

1、下载官方提供的规则插件包
2、根据需求编写规则类
3、编译打包
4、上传自定义规则插件

下载地址:
1、Java自定义规则插件:
https://github.com/SonarSourc...

2、Xml自定义规则插件:
https://sonarsource.bintray.c...

开发环境

JDK1.8以上
Mavean
Jenkins

编写方法

目前SonarQube自定义规则支持的方式有两种: 编写java类和编写XPath表达式,这两种方式都是基于AST(Abstract Syntax Tree抽象语法树)语法结构来实现的。
1、Xpath方式
需求:
从Java代码中查找是否存在 while {}这种语法结构

表达式代码:
//WhileStatement[not(Statement/Block)]

步骤:
将表达式代码放入自定义规则插件中的Expression中

编写SonarQube自定义Java和Xml规则

这种方式需要借助第三方工具来写表达式,并且要对Xpath语法比较熟练,我觉得并不是很强大,需要花一定的时间学习。

2、Java方式
需求:从Xml文件中查找,元素是否存在“zbc_test”这样的内容
步骤:
① 创建自定义规则类
sonar-xml-plugin/src/main/java/org/sonar/plugins/check

编写SonarQube自定义Java和Xml规则

② 根据规则需求编写代码

编写SonarQube自定义Java和Xml规则

③ 注册新加入的规则

编写SonarQube自定义Java和Xml规则

④ 编写规则描述及等级分类文件,名字要和规则类中的Key相同或者规则类名相同

sonar-xmlplugin/src/main/resources/org/sonar/l10n/xml/rules/xml/DbSchemalCheck.html

编写SonarQube自定义Java和Xml规则

sonar-xml-plugin/src/main/resources/org/sonar/l10n/xml/rules/xml/DbSchemalCheck.json

编写SonarQube自定义Java和Xml规则

编译打包

Eclipse选择要编译打包的项目文件,使用Maven进行编译,如果编译时不需要进行单元测试,可以跳过测试。

编写SonarQube自定义Java和Xml规则

编译成功

编写SonarQube自定义Java和Xml规则

将编译好的插件上传至指定路径:/sonarqube-6.3/extensions/plugins

编写SonarQube自定义Java和Xml规则

重新启动SonarQube,进入菜单Administration—System - Update Center 查看自定义规则插件是否安装成功

编写SonarQube自定义Java和Xml规则

编写SonarQube自定义Java和Xml规则

查看自定义规则

进入SonarQube - Rules 选择XML可以查看刚刚编写的自定义规则:

编写SonarQube自定义Java和Xml规则

自定义规则的描述如下:
编写SonarQube自定义Java和Xml规则

测试自定义规则

两种方法,编写单元测试类和手工测试,需要根据规则的复杂程度进行选择。
编写Java单元测试类:
java-custom-rules/src/test/java/org/sonar/samples/java/checks/MyCustomSubscriptionRuleTest.java

编写SonarQube自定义Java和Xml规则

编写Xml单元测试类:

sonar-xml-plugin/src/test/java/org/sonar/plugins/xml/checks/IllegalTabCheckTest.java

手工测试:

进入Jenkins,选择要扫描的项目进行构建,构建完成后点击右侧的SonarQube蓝色图标,查看扫描结果

编写SonarQube自定义Java和Xml规则

选择左侧的选项,查看所有存在问题的文件和错误规则

编写SonarQube自定义Java和Xml规则

点击文件名查看所有扫描出来的错误代码及说明

编写SonarQube自定义Java和Xml规则

总结

刚开始以为只要写几个表达式,就可以很方便实现复杂的规则,但是摸索了几天查了几天的Google ,才知道还是要下载官方的自定义规则插件,然后用Java编写自己的规则类,饶了一大圈很累。
我还下载了其他的一些SonarQube插件,通过查看代码发现,基本都遵守并实现了官方的Plugin接口

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
4年前
CentOS安装SonarQube7.9.1
1、准备   SonarQube版本:sonarqube7.9.1.zip,官网地址:https://www.sonarqube.org/downloads/(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.sonarqube.org%2Fdownloads%2F) 
Wesley13 Wesley13
4年前
Java实现ModbusTCP通信
一个项目,需要用Java实现使用ModbusTCP和硬件设备通信资料代码下载本文的代码和仿真软件:蓝奏云下载(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.lanzous.com%2Fi636hli)官网资料Modbus官
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
Mac下使用SBT搭建play framework 2.x 项目
由于工作需要,项目中用到play,到官网上大致看了一下文档,在网上搜索了很多资料。总结如下:\\1.下载安装说明\\play官网2.2版本以后都不能手动下载。play官方建议使用sbt构建play项目,并且要求jdk1.8版本。下载解压sbt,设置环境变量。\\2.构建项目\\