ali p3c规则扩展-集成sonar
最近公司需要完善检测机制,所以我这边对于原有的ali p3c的类进行了一次扩展,扩展主要分为两个部分。
第一:对于规则的编写
可以在github上面找到最新的p3c-master项目,之前老的p3c只有40多条rule,现在新的增加到了50多条。打开项目,然后对其进行扩展。在扩展之前需要去pmd官网下载一个pmd下载一个code analyzer用于分析代码结构的。解压pmd包里面有一个bin目录,win系统可以直接点击开bat文件,对于mac用户需要终端进入到bin目录下运行 ./run.sh designer 命令,然后可以看到如下界面:
通过这个抽象语法树结构分析我们可以更快的开发相应的规则,接下来我们需要在p3c-master上面进行对于rule的扩展。
第一步编写规则:
在p3c-master下面的p3c-pmd下面src -> main -> java -> com.alibaba.p3c.pmd.lang.java.rule里面编写规则,可以新加一个package也可以使用里面的other package;
eg:在pojo类里面不允许出现isXX与getXX同时出现
public class PojoPropertyMethodRule extends AbstractPojoRule {private static final String METHOD_XPATH = "//MethodDeclaration";private static final String VIOLATION_MESSAGE = "java.oop.PojoPropertyMethodRule.violation.msg";@Overridepublic Object visit(ASTClassOrInterfaceDeclaration node, Object data) {if (!isPojo(node)) {return super.visit(node, data);}try {List<Node> methods = node.findChildNodesWithXPath(METHOD_XPATH);Set methodNameSet = new HashSet();for (Node method : methods) {ASTMethodDeclaration astMethod = (ASTMethodDeclaration) method;if (astMethod.getMethodName().startsWith("get")) {int methodNameLength = astMethod.getMethodName().length();String methodName = astMethod.getMethodName().substring(3, methodNameLength);if (methodNameSet.contains(methodName)) {addViolationWithMessage(data, node, VIOLATION_MESSAGE, new Object[]{astMethod.getMethodName()});} else {methodNameSet.add(methodName);}}if (astMethod.getMethodName().startsWith("is")) {int methodNameLength = astMethod.getMethodName().length();String methodName = astMethod.getMethodName().substring(2, methodNameLength);if (methodNameSet.contains(methodName)) {addViolationWithMessage(data, node, VIOLATION_MESSAGE, new Object[]{astMethod.getMethodName()});} else {methodNameSet.add(methodName);}}}} catch (JaxenException e) {throw new RuntimeException(e.getMessage(), e);}return super.visit(node, data);}}
里面的代码结构,比如获取某个节点某个方法名或者参数名称都可以根据上面点PMD分析工具去写。
第二步将规则错误信息加入到message.xml上面,在resources文件夹里面有一个文件夹放message.xml,需要将代码里面的报错信息 java.oop.PojoPropertyMethodRule.violation.msg 对应加入到message里面去。里面有中文和英文版,看要求添加,添加eg:
第一条表示某个地方有规则问题,第二条是描述这个规则是什么。
第三步将规则注册resources下面的rulesets -> java 下面的某个xml里面去,注意:千万不要去新加一个xml,复用这里面有的,因为这些是在ali的包里面注册好的,新加一个xml是没有效果的!!
注册格式如下:
到这里一个规则的添加就结束了!
下面是对于这个规则的test,因为我的规则是写在oop package里面的,所以我等会也是使用oop里面的test进行测试;
第一步先打开test文件夹java下面的包目录的oop包,里面有一个OopRuleTest,打开可以看到有一个setUp里面包含了之前上面ali-oop.xml里面注册的所有规则,我们需要将我们这条新的规则加入到setUp方法里面,然后再写一个test方法,eg:
public class OopRuleTest extends SimpleAggregatorTst {// 加载CLASSPATH下的rulesets/java/ali-oop.xmlprivate static final String RULESET = "java-ali-oop";@Overridepublic void setUp() {addRule(RULESET, "EqualsAvoidNullRule");addRule(RULESET, "WrapperTypeEqualityRule");addRule(RULESET, "PojoNoDefaultValueRule");addRule(RULESET, "PojoMustUsePrimitiveFieldRule");addRule(RULESET, "PojoMustOverrideToStringRule");addRule(RULESET, "StringConcatRule");addRule(RULESET, "BigDecimalAvoidDoubleConstructorRule");addRule(RULESET, "PojoPropertyMethodRule");}@Testpublic void testMain(){Rule rule = this.findRule(RULESET,"PojoPropertyMethodRule");runTests(rule,"PojoPropertyMethodRule");}
}
在testMain里面有2行代码,第一行就是说使用Ruleset里面的哪个规则,第二行就是这个规则需要检测的example,接下来,我们需要写一个单元测试的example;
同样是在test包里面的resources里面下有一个oop.xml包,在里面新增加一个PojoPropertyMethodRule.xml文件,然后里面的内容是eg:
<?xml version="1.0" encoding="UTF-8"?>
<test-data xmlns="http://pmd.sourceforge.net/rule-tests"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://pmd.sourceforge.net/rule-tests https://pmd.sourceforge.io/rule-tests_1_0_0.xsd"><code-fragment id="pojo-property-method-rule"><![CDATA[public class FooDO {private boolean enable;public boolean isEnable(){return enable;}public boolean getEnable(){ //BADreturn enable;}}]]></code-fragment><test-code><description>POJO has primitive type fields</description><expected-problems>1</expected-problems><expected-linenumbers>7</expected-linenumbers><code-ref id="pojo-property-method-rule" /></test-code></test-data>
接下来可以看下运行test的效果:
可以看到在控制台上面显示出了检测的问题,这就说明规则是没有问题的,到这里对于p3c规则的扩展开发就结束了;
新开发的p3c集成到sonar上
为什么还需要开发sonar项目才可以集成?
原因是p3c项目无法继承到sonar检测系统上面,需要给它包装一层外壳,所以可以去github上面找sonar-pmd项目,eg:https://github.com/mrprince/sonar-p3c-pmd,或者其他的git有这个项目的都可以。
第一步导入p3c的jar包,将之前开发的p3c的jar放入到maven私服上面,然后在sonar-pmd项目里面pom文件引用,从git上面下载的sonar-p3c项目都是引用了ali的包,可以改成自己的包
<dependency><groupId>com.alibaba.p3c</groupId><artifactId>p3c-pmd</artifactId><version>2.2.6</version></dependency>
里面的版本是我自己扩展后自己升级的;
第二步是在sonar-pmd-plugin里面的resources里面的org.sonar/l10n/pmd.rules下面的pmd.properties文件将非ali规则全部注释了,注意:带了param.xxx结尾的不要注释;
然后全部注释完成后,在下面加入ali-p3c的所有规则,目前下载的这个sonar-pmd已经把ali的规则写在里面了,只需要加入新扩展的,如下面图片的最后一条,则是新扩展的;
第三步注释掉pmd-model.xml里面的非ali-p3c配置,然后把扩展的配置也加入进去;注释掉就意味着屏蔽规则,而在这里我们只是需要ali-p3c及我们扩展的规则,其他都不需要;
第四步是将resources -> org.sonar -> plugins.pmd ->rules.xml注释了,然后添加阿里的开发规则,为了区别阿里的p3c规则,这里新建了一个rules-p3c.xml文件,然后在PmdRulesDefinition类中指定一下rules-p3c.xml 路径;
这个项目提前建立好了这个文件,可以直接在项目里面查看,然后把扩展的规则添加进去:
<rule key="PojoPropertyMethodRule"><priority>MAJOR</priority><configKey><![CDATA[rulesets/java/ali-oop.xml/PojoPropertyMethodRule]]></configKey></rule>
第五步添加相应的描述文件html,在这里我比较懒就没有写描述文件,只是加了一个空的,但是注意这个一定要加,不然sonar会保错的!
现在整个p3c就被sonar外壳包装好了,接下来可以直接使用maven打一个jar包上传到sonarqube上面去,然后为了区分sonarqube目前整个规则的名称,可以修改 sonar-p3c-pmd 工程中的PmdConstants类 Sring REPOSITORY_NAME 名字。这样就整个sonar扫描规则开发结束了。
ali p3c规则扩展-集成sonar相关推荐
- sonar添加(集成)阿里java代码p3c规则
集成p3c规则包 将制作好的p3c规则jar包放在extensions/plugins下,重启 制作方法可以参考网上,如果要现成的jar包,可以点击这个下载 验证是否集成成功 在代码规则下的资源库里查 ...
- Sentinel(十三)之动态规则扩展
转载自 动态规则扩展 规则 Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则.Sentinel 提供两种方式修改规则: 通过 API 直接修改 (l ...
- 基于docker使用jenkins集成sonar
前言 基于jenkins可以完成项目的可持续集成,同时由于jenkins强大的插件管理功能,可以集成众多的其他插件完成项目管理中的其他功能,比如可以使用jenkins集成sonar完成对项目构建的时候 ...
- Jenkins集成Sonar(3/3)- 安装SonarQube Scanner进行扫描(离线安装)
安装方式选择: 在线安装:直接在Jenkins>系统管理>插件管理>可选插件,搜索Sonar 离线安装:下载sonar插件,将插件解压放入~/.jenkins/plugins/下即可 ...
- mvn集成sonar
mvn集成sonar 前提 1.mvn已配置完成 2.本环境选用8.0版本sonarqube不支持jdk8.0,不支持MySQL(7.6以下可以),现在选用Java11,postgres12(注意多版 ...
- 【devops】七、集成Sonar Qube
目录 说明 七.集成Sonar Qube 7.1 Sonar Qube介绍 7.2 Sonar Qube环境搭建 7.2.1 Sonar Qube安装--docker安装 7.2.2 访问sonarq ...
- 【云原生】DevOps(四):集成Sonar Qube
本文目录: 一.Sonar Qube介绍 二.Sonar Qube环境搭建 1. Sonar Qube安装 2. 安装中文插件 三.Sonar Qube基本使用 1. Maven实现代码检测 2. S ...
- Jenkins集成Sonar Qube
前文目录 Jenkins安装部署使用_南宫乘风的博客-CSDN博客 Jenkins入门配置_南宫乘风的博客-CSDN博客 Sonar Qube介绍 Sonar Qube是一个开源的代码分析平台,支持J ...
- jenkins集成sonar
1.sonar介绍 sonar是sonarqube的缩写,是一款用来检查代码质量的开源软件. sonar由两部分组成: ----sonarqube(监控端,sonar server):用来收集监控信息 ...
- jenkins:集成sonar代码扫描+发送邮件
前提: Jenkins JDK 目录: 1.安装sonar插件:SonarQube Scanner for Jenkins 2.安装SonarQube 3.安装sonar-scanner ++++++ ...
最新文章
- Pyinstall打包多个python脚本,包含DLL文件
- VTK:PolyData之InterpolateMeshOnGrid
- 【Python3】print用逗号,write用加号
- 【302天】跃迁之路——程序员高效学习方法论探索系列(实验阶段60-2017.12.04)...
- 关于SQL Server安装文件挂起错误解决办法
- linux下找不到libc 库,Linux-覆盖libc open()库函数
- ASP.NET Web API 处理架构
- 如何暂停一个正在运行的线程?
- node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
- 2015/04/01 RHCS
- debian安装什么mysql_安装多个mysql实例(debian版本)
- c语言找最长串指针改错,2013年计算机二级C语言上机试题及解析35
- Python数据结构实战——队列(Queue)
- php开发技术规范怎么写,PHP开发技术规范!(2)
- 读书笔记-人月神话13
- 苹果cookie是打开还是关闭_如何避免苹果safari自带浏览器“跟踪”你的信息!
- 可偏导不一定连续的例子
- Android Studio适配Mac M1
- Ubuntu14.04显示隐藏文件
- 微信可以用邮箱吗?邮箱无法分享到微信怎么办?微信邮箱从哪找呢