本篇文章主要围绕对sonar-pmd-p3c插件的解析

版本说明

组件 版本
sonarqube 8.4
sonar-pmd-p3c.jar 3.2.1
pmd-java 6.15.0
p3c-pmd 2.1.0

参考文献

1.ali-p3c-pmd仓库
2.pmd仓库
3.sonar-pmd仓库
4.sonar-pmd-p3c仓库

关系图

基于以上开源插件讲解

增加规则

我是以sonar-pmd-p3c插件3.2.1版本为基础进行修改

  1. 规则列表显示
sonar-pmd-p3c\sonar-pmd-plugin\src\main\resources\org\sonar\l10n\pmd.properties
增加:
rule.pmd.AvoidMessageDigestField.name=Avoid Message Digest Field

用于此处:

2. 规则代码添加

sonar-pmd-p3c\sonar-pmd-plugin\src\main\resources\org\sonar\plugins\pmd\rules.xml
增加:<rule key="AvoidMessageDigestField"><priority>MAJOR</priority><configKey>category/java/bestpractices.xml/AvoidMessageDigestField</configKey>
<!--    <status>DEPRECATED</status>如果此条规则弃用,则添加此属性--></rule>

3.规则类型配置

sonar-pmd-p3c\sonar-pmd-plugin\src\main\resources\com\sonar\sqale\pmd-model.xml
增加:
<chc><rule-repo>pmd</rule-repo><rule-key>AvoidMessageDigestField</rule-key><prop><key>remediationFunction</key><txt>CONSTANT_ISSUE</txt></prop><prop><key>offset</key><val>10</val><txt>min</txt></prop></chc>

4.为何是问题页面

在sonar-pmd-p3c\sonar-pmd-plugin\src\main\resources\org\sonar\l10n\pmd\rules\pmd</kbd>

目录下新建AvoidMessageDigestField.html,添加内容。

Declaring a MessageDigest instance as a field make this instance directly available to multiple threads.
Such sharing of MessageDigest instances should be avoided if possible since it leads to wrong results
if the access is not synchronized correctly.
Just create a new instance and use it locally, where you need it.
Creating a new instance is easier than synchronizing access to a shared instance.
<pre>
import java.security.MessageDigest;public class AvoidMessageDigestFieldExample {private final MessageDigest sharedMd;public AvoidMessageDigestFieldExample() throws Exception {sharedMd = MessageDigest.getInstance("SHA-256");}public byte[] calculateHashShared(byte[] data) {// sharing a MessageDigest like this without synchronizing access// might lead to wrong resultssharedMd.reset();sharedMd.update(data);return sharedMd.digest();}// betterpublic byte[] calculateHash(byte[] data) throws Exception {MessageDigest md = MessageDigest.getInstance("SHA-256");md.update(data);return md.digest();}}
</pre>

html文件内容来源?
确认我们增加的是pmd规则,找到本地仓库下载的pmd-java依赖包
打开sonar-pmd-p3c\sonar-pmd-plugin\pom.xml文件,查找pmd-java包

   <dependency><groupId>net.sourceforge.pmd</groupId><artifactId>pmd-java</artifactId></dependency>

我的本地仓库在C:\Users\Administrator.m2\repository\net\sourceforge\pmd\pmd-java
查看pmd-java版本号:D:\IdeaProjects\sonar-pmd-p3c\pom.xml

    <pmd.version>6.15.0</pmd.version>

进入本地仓库,只有jar包

解压pmd-java-6.15.0.jar,查看规则所在的bestpractices.xml文件,这里的路径与上文2.规则代码添加路径一致。
bestpractices.xml文件关于此条规则的代码,挑出rule name、message、description<kbd>example代码放入AvoidMessageDigestField.html文件即可:

     <rule name="AvoidMessageDigestField"language="java"since="6.18.0"message="You shouldn't declare field of MessageDigest type, because unsynchronized access could cause problems"typeResolution="true"class="net.sourceforge.pmd.lang.rule.XPathRule"externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_bestpractices.html#avoidmessagedigestfield"><description>Declaring a MessageDigest instance as a field make this instance directly available to multiple threads.Such sharing of MessageDigest instances should be avoided if possible since it leads to wrong resultsif the access is not synchronized correctly.Just create a new instance and use it locally, where you need it.Creating a new instance is easier than synchronizing access to a shared instance.</description><priority>3</priority><properties><property name="version" value="2.0"/><property name="xpath"><value><![CDATA[//FieldDeclaration[pmd-java:typeIs('java.security.MessageDigest')]]]></value></property></properties><example><![CDATA[import java.security.MessageDigest;public class AvoidMessageDigestFieldExample {private final MessageDigest sharedMd;public AvoidMessageDigestFieldExample() throws Exception {sharedMd = MessageDigest.getInstance("SHA-256");}public byte[] calculateHashShared(byte[] data) {// sharing a MessageDigest like this without synchronizing access// might lead to wrong resultssharedMd.reset();sharedMd.update(data);return sharedMd.digest();}// betterpublic byte[] calculateHash(byte[] data) throws Exception {MessageDigest md = MessageDigest.getInstance("SHA-256");md.update(data);return md.digest();}}]]></example></rule>
  1. 控制台mvn clean package -DskipTests打包
  2. jar包放入sonarqube-8.4.1.35646/extensions/plugins/,切换sonarqube重启应用
  3. 此插件html显示,如:
  4. 其它小优化
    更改jar包名称,与sonar-pmd-plugin区分
    github上有N多插件,有些只是有pmd-java,它也叫这个名字,而我用的插件是整合是pmd-java和com.alibaba.p3c-pmd的。
    \sonar-pmd-p3c\sonar-pmd-plugin\pom.xml更改项目标识符
<artifactId>sonar-pmd-p3c-plugin</artifactId>

更改规则名称,与sonar-pmd-plugin区分
\sonar-pmd-p3c\sonar-pmd-plugin\src\main\java\org\sonar\plugins\pmd\PmdConstants.java更改

    public static final String REPOSITORY_NAME = "PMD-p3c";

整改后的源码和jar下载

https://download.csdn.net/download/sincool1003/74101211

sonar pmd\p3c插件源码初步解析相关推荐

  1. 【笔记-vue】《imooc-vue.js高仿饿了么》、《imooc-vue 音乐app》、《imooc-vue.js源码全方位解析》

    20170709 - 20171128:<imooc-vue.js高仿饿了么> 一.第一章 课程简介 1-1课程简介 1.需求分析-脚手架工具-数据mock-架构设计-代码编写-自测-编译 ...

  2. Spring源码深度解析(郝佳)-Spring 常用注解使用及源码解析

      我们在看Spring Boot源码时,经常会看到一些配置类中使用了注解,本身配置类的逻辑就比较复杂了,再加上一些注解在里面,让我们阅读源码更加难解释了,因此,这篇博客主要对配置类上的一些注解的使用 ...

  3. Spring源码深度解析(郝佳)-学习-源码解析-Spring整合MyBatis

    了解了MyBatis的单独使用过程之后,我们再来看看它也Spring整合的使用方式,比对之前的示例来找出Spring究竟为我们做了什么操作,哪些操作简化了程序开发. 准备spring71.xml &l ...

  4. 开源Vue表格组件,表格插件源码

    开源Vue表格组件,表格插件源码 前言: 关于html里面原生的table,通常满足不了程序员的要求.所以开发了一款表格插件,其功 能有: 1 导入json格式数据后,自动填充表格.表格长宽自适应.排 ...

  5. iOS开发之Masonry框架源码深度解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

  6. 【Flutter】Flutter 拍照示例 ( Flutter 插件配置 | Flutter 插件源码示例 | iOS 应用配置 | Android 应用配置 )

    文章目录 一.Flutter 插件配置 二.Flutter 插件源码示例 三.iOS 应用配置 四.Android 应用配置 五.相关资源 一.Flutter 插件配置 Flutter 拍照示例中 , ...

  7. 【TarsosDSP】TarsosDSP 简介 ( TarsosDSP 功能 | 相关链接 | 源码和相关资源收集 | TarsosDSP 示例应用 | TarsosDSP 源码路径解析 )

    文章目录 I . TarsosDSP 函数库简介 II . TarsosDSP 功能 III . TarsosDSP 相关资源链接 ( 官方资料 ) IV . TarsosDSP 源码和相关资源收集 ...

  8. 机器学习算法源码全解析(三)-范数规则化之核范数与规则项参数选择

    前言 参见上一篇博文,我们聊到了L0,L1和L2范数,这篇我们絮叨絮叨下核范数和规则项参数选择.知识有限,以下都是我一些浅显的看法,如果理解存在错误,希望大家不吝指正.谢谢. 机器学习算法源码全解析( ...

  9. 从源码角度解析Android中APK安装过程

    从源码角度解析Android中APK的安装过程 1. Android中APK简介 Android应用Apk的安装有如下四种方式: 1.1 系统应用安装 没有安装界面,在开机时自动完成 1.2 网络下载 ...

  10. dubbo源码深度解析_Spring源码深度解析:手把手教你搭建Spring开发环境

    Spring环境搭建流程,如果是第一次接触spring源码的环境搭建,确实还是比较麻烦的. 作者使用的编译器为目前流行的lntelliJ IDEA,版本为2018旗舰版.Eclipse用户还需要自己揣 ...

最新文章

  1. 第15届全国大学生智能汽车竞赛 人工智能挑战赛(百度)
  2. vi/vim粘贴代码自动缩进导致全乱了
  3. 关于怎么将Quartus和Nios程序一起固化到FPGA里面
  4. vsc系统是什么意思_电脑蓝屏是什么意思?蓝屏就一定要重装系统吗?你可不要弄错了...
  5. 使用Go语言从零编写PoS区块链
  6. Tokyo Tyrant的下工具的使用
  7. java中的日期时间的计算与比较
  8. 解决cc1plus.exe: out of memory allocating bytes
  9. java typereference_记录一下jackson中TypeReference的使用
  10. 第一次“2016第三届科学数据大会”新闻发布会在上海举行
  11. 继续教育自动听课软件_荣耀小口哨app下载-华为荣耀小口哨软件v1.9.9 安卓最新版 - 极光下载站...
  12. 七夕来临!来支付宝“结个婚”吧 全国5个省市可用
  13. JVM调优日志解析分析
  14. php嗅探源码,网络嗅探器(含源代码)
  15. 《Java EE互联网轻量级框架整合开发》在京东预售,发个目录
  16. java poi excel 图表_Java用POI实现根据Excel表格模板生成新的Excel并实现数据输出
  17. 细数门店客流量统计的那些技术
  18. 卸载pip包并卸载其依赖包
  19. 数控编程之刀具点位的全套知识
  20. android设置管理员权限设置,android 获取超级管理员权限,进行锁屏、恢复出厂设置...

热门文章

  1. python行业中性_知乎
  2. JAVA毕业设计高校教学资源共享平台计算机源码+lw文档+系统+调试部署+数据库
  3. 酒店ETL管理解决方案
  4. 再写轮播图——两张图切换,一张充当背景并且模糊,一张做展示图
  5. 【宋红康 MySQL数据库 】【高级篇】【01】CentOS7下MySQL的安装与使用
  6. 原码一位乘法和补码一位乘法
  7. C++语言,线性素数筛(欧拉筛)
  8. 差分编码 Differential Encoding
  9. 计算机内部总线和外部总线,总线分为内部总线和外部总线
  10. 古典钢琴音源插件-COLOVE Products Pianos X1 v2.0 WiN-MAC