sonar-java 自定义规则

前言

最近在搞代码质量方面的项目,主要是针对Java语言,其他语言实际上也可以执行检查,核心原理是一样的,都是静态代码扫描,如果需要进行动态代码运行验证则可以通过单元测试的方式。以其中一个示例,实现自定义Java sonar规则。

准备

需要安装sonarqube或者sonarlint插件,自行实现

github:GitHub - SonarSource/sonar-java: :coffee: SonarSource Static Analyzer for Java Code Quality and Security

这里对于sonar来说,还有sonarqube的兼容性问题,这个xml定义了兼容的sonarqube版本,这里是8.9,笔者在使用最新版7.30.1.34514就出现签名错误的问题,这个版本支持9.9

 

关键是如下2个jar,在7.30相近的版本会出问题:An exception occurred while running the Java custom rule - Writing rules - Sonar Community

Caused by: java.lang.SecurityException: class "org.eclipse.jdt.core.dom.ASTUtils"'s signer information does not match signer information of other classes in the same package at java.base/java.lang.ClassLoader.checkCerts(ClassLoader.java:1150) 

 

可通过自定义版本依赖规避

编写规则

规则分为3部分:

1. 规则扫描部分

2. 示例代码部分

3. 规则描述文件部分

示例代码主要用来测试,即使代码编译不过,也可以执行扫描,因为是源码扫描

可以直接使用单元测试来验证规则,因为依赖了

java-checks-testkit

查看示例代码

@Rule(key = "SpringControllerRequestMappingEntity")
public class SpringControllerRequestMappingEntityRule extends BaseTreeVisitor implements JavaFileScanner {private JavaFileScannerContext context;// 扫描自定义,一般不需要@Overridepublic void scanFile(JavaFileScannerContext context) {this.context = context;scan(context.getTree());}/*** Overriding the visitor method to implement the logic of the rule.* @param tree AST of the visited method.*/@Overridepublic void visitMethod(MethodTree tree) {Symbol.MethodSymbol methodSymbol = tree.symbol();// 类注解扫描SymbolMetadata parentClassOwner = methodSymbol.owner().metadata();boolean isControllerContext = parentClassOwner.isAnnotatedWith("org.springframework.stereotype.Controller");// 方法注解扫描if (isControllerContext && methodSymbol.metadata().isAnnotatedWith("org.springframework.web.bind.annotation.RequestMapping")) {// 方法的参数识别for (VariableTree param : tree.parameters()) {TypeTree typeOfParam = param.type();if (typeOfParam.symbolType().symbol().metadata().isAnnotatedWith("javax.persistence.Entity")) {// 识别参数的注解,然后报告问题,用于生成扫描问题报告// 在示例代码就会触发规则,如果我们把示例代码注解注释,就会扫描通过context.reportIssue(this, typeOfParam, String.format("Don't use %s here because it's an @Entity", typeOfParam.symbolType().name()));}}}super.visitMethod(tree);}}

如果需要写其他的规则,那么sonar原生的很多已经实现的规则可以参考,修改即可,逻辑就是获取代码特征,然后根据自己的业务具体要求,实现代码逻辑即可,有点Java编译为class的味道。 

测试

使用测试用例

如果我们去掉参数的注解,执行单元测试,因为这个时候就符合规则扫描要求了,sonar的单元测试是有规则触发的问题时才是正常过测试用例的

总结

实际上这个很简单,如果需要考虑,那么需要考虑扫描算法怎么写,性能是否OK,毕竟一般执行扫描都是在代码编译打包的过程,本地很少单独执行扫描。sonar的规则写好后不需要使用sonarqube也可以验证,如果需要把规则给sonarqube,那么需要执行Maven插件的打包,放在sonarqube的plugins里面,sonar插件执行的shade fat jar打包,不需要额外的文件配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/475944.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防火墙综合拓扑

要求: 1.办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 在FW1上 做安全策略 做NAT策略 这样,两条线就负载均衡了,并且相当于做了一个备份,一个断了就走另一条 2.分公司…

信息安全认证 | CISP证书怎么样?值得考吗?

HCIE考证研究所的朋友们,新年快乐! 今天给大家说说CISP证书,新的一年祝大家逢考必过啊~ 01 考注册信息安全工程师证书的用处 CISP证书可作为学识和技能证明;求职、任职、晋升、加薪的资格凭证;用人单位招聘、录用劳动…

《富爸爸:巴比伦最富有的人》读书笔记

目录 作者简介 感悟 经典摘录 观点: 支付给自己(理解是投资自己) 观点:源源不断地放入金币 观点: 把收入的一部分留给我自己 观点: 从专业的人士得到建议 观点:一旦为自己规定了任务,就一定要完成 …

模型超参数寻优

参考某篇QSAR的sci论文设置 根据上图,我设置我的XGBoost模型: # 定义要搜索的超参数的候选值 param_grid {model__learning_rate: [0.1, 0.01, 0.001], # 调整学习率model__n_estimators: [50, 100, 200, 300,400,500], # 调整树的数量model__max_de…

SG7050VAN晶体振荡器规格书

SG7050VAN 晶振是EPSON/爱普生的一款额定频率73.5 MHz to 700 MHz的石英晶体振荡器,4脚贴片,7050封装常规有源晶振,具有小尺寸,高稳定性。该款有源晶体振荡器,可以在B : -20 C to 70 C / G : -40 C to 85 C C的温度内稳…

《苍穹外卖》知识梳理P9-定时任务、来单提醒与用户催单

一.定时任务 实现定时任务可以使用spring家族中的sprinig-task; 1.1 spring-task spring-task是Spring框架的任务调度工具,可以按照约定的时间自动执行某个代码逻辑; 应用场景 信用卡每月归还贷款提醒,定时任务检查&#xff…

嵌入式面试:瑞芯微

文章目录 一、2024 秋招1.1 IIC的速率范围 :1.2 linux驱动子系统汇总 :1.3 linux关抢占情况汇总 :1.4 操作或者读写一个文件时,从用户态到内核态再到物理介质的流程(考点:虚拟文件系统) : 一、2024 秋招 1…

电商+支付双系统项目------设计数据库

这篇文章将详细介绍电商支付双系统项目的数据库设计。数据库在该项目中扮演着至关重要的角色,它负责存储和管理用户信息、商品数据、订单记录以及支付交易等关键数据。通过精心设计和优化数据库结构,可以实现高效的数据存储和检索,确保系统的…

多维时序 | Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间序列预测

多维时序 | Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间序列预测 目录 多维时序 | Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于VMD-DBO-LSTM、VMD-LSTM、LSTM的多变量时间…

Java面试第一站:计算机网络基础知识

该系列会持续更新,关注我,第一时间获取我的最新动态哟 Java面试中,经常会问到跟计算机网络知识相关的考点,有的小伙伴不是很明白。考察网络知识有什么意义? 因为编程的时候,多数的情况下是不用我们来编写 …

深度学习与计算机视觉 | 实用CV开源项目汇总(有github代码链接,建议收藏!)

本文来源公众号“深度学习与计算机视觉”,仅用于学术分享,侵权删,干货满满。 原文链接:【建议收藏】实用CV开源项目汇总(文末有彩蛋~) 01 Trace.moe 图像反向搜索动漫场景,使用动漫截图搜索该…

普源(RIGOL) DHO914S示波器 简单开箱评测

普源精电(RIGOL) DHO914S 12bit数字示波器 简单开箱评测。 旧的示波器感觉不好用,所以换个新的,看中了普源的这款,主要看中它便携支持PD供电,还有伯德图功能,以及12bit的垂直分辨率。如果你对我上面说的点没需求&…