最近公司需要完善检测机制,所以我这边对于原有的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相关推荐

  1. sonar添加(集成)阿里java代码p3c规则

    集成p3c规则包 将制作好的p3c规则jar包放在extensions/plugins下,重启 制作方法可以参考网上,如果要现成的jar包,可以点击这个下载 验证是否集成成功 在代码规则下的资源库里查 ...

  2. Sentinel(十三)之动态规则扩展

    转载自  动态规则扩展 规则 Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则.Sentinel 提供两种方式修改规则: 通过 API 直接修改 (l ...

  3. 基于docker使用jenkins集成sonar

    前言 基于jenkins可以完成项目的可持续集成,同时由于jenkins强大的插件管理功能,可以集成众多的其他插件完成项目管理中的其他功能,比如可以使用jenkins集成sonar完成对项目构建的时候 ...

  4. Jenkins集成Sonar(3/3)- 安装SonarQube Scanner进行扫描(离线安装)

    安装方式选择: 在线安装:直接在Jenkins>系统管理>插件管理>可选插件,搜索Sonar 离线安装:下载sonar插件,将插件解压放入~/.jenkins/plugins/下即可 ...

  5. mvn集成sonar

    mvn集成sonar 前提 1.mvn已配置完成 2.本环境选用8.0版本sonarqube不支持jdk8.0,不支持MySQL(7.6以下可以),现在选用Java11,postgres12(注意多版 ...

  6. 【devops】七、集成Sonar Qube

    目录 说明 七.集成Sonar Qube 7.1 Sonar Qube介绍 7.2 Sonar Qube环境搭建 7.2.1 Sonar Qube安装--docker安装 7.2.2 访问sonarq ...

  7. 【云原生】DevOps(四):集成Sonar Qube

    本文目录: 一.Sonar Qube介绍 二.Sonar Qube环境搭建 1. Sonar Qube安装 2. 安装中文插件 三.Sonar Qube基本使用 1. Maven实现代码检测 2. S ...

  8. Jenkins集成Sonar Qube

    前文目录 Jenkins安装部署使用_南宫乘风的博客-CSDN博客 Jenkins入门配置_南宫乘风的博客-CSDN博客 Sonar Qube介绍 Sonar Qube是一个开源的代码分析平台,支持J ...

  9. jenkins集成sonar

    1.sonar介绍 sonar是sonarqube的缩写,是一款用来检查代码质量的开源软件. sonar由两部分组成: ----sonarqube(监控端,sonar server):用来收集监控信息 ...

  10. jenkins:集成sonar代码扫描+发送邮件

    前提: Jenkins JDK 目录: 1.安装sonar插件:SonarQube Scanner for Jenkins 2.安装SonarQube 3.安装sonar-scanner ++++++ ...

最新文章

  1. Pyinstall打包多个python脚本,包含DLL文件
  2. VTK:PolyData之InterpolateMeshOnGrid
  3. 【Python3】print用逗号,write用加号
  4. 【302天】跃迁之路——程序员高效学习方法论探索系列(实验阶段60-2017.12.04)...
  5. 关于SQL Server安装文件挂起错误解决办法
  6. linux下找不到libc 库,Linux-覆盖libc open()库函数
  7. ASP.NET Web API 处理架构
  8. 如何暂停一个正在运行的线程?
  9. node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
  10. 2015/04/01     RHCS
  11. debian安装什么mysql_安装多个mysql实例(debian版本)
  12. c语言找最长串指针改错,2013年计算机二级C语言上机试题及解析35
  13. Python数据结构实战——队列(Queue)
  14. php开发技术规范怎么写,PHP开发技术规范!(2)
  15. 读书笔记-人月神话13
  16. 苹果cookie是打开还是关闭_如何避免苹果safari自带浏览器“跟踪”你的信息!
  17. 可偏导不一定连续的例子
  18. Android Studio适配Mac M1
  19. Ubuntu14.04显示隐藏文件
  20. 微信可以用邮箱吗?邮箱无法分享到微信怎么办?微信邮箱从哪找呢

热门文章

  1. 【python】词云图制作
  2. stuiod3t-2019030.dmg下载及studio3t macOS Cracking教程
  3. 蓝桥杯python青少年_让孩子参加蓝桥杯大赛好吗
  4. 上帝视角Hbase二级索引方案全解析
  5. FreeCAD源码分析:Assembly3模块
  6. ArcGis学习资料汇总整理
  7. 在家如何下载nature中的文献
  8. 用proxifier、ccproxy、teamviewer做网络代理
  9. opencms 发布过程深入研究
  10. 给VS2008安装MSDN